【问题标题】:Why is the input not being written to file even if fprintf is used to pass the input to the file pointer?为什么即使使用 fprintf 将输入传递给文件指针,输入也没有写入文件?
【发布时间】:2013-06-28 07:30:15
【问题描述】:

我尝试了一些基于 C 的问题,但陷入了这个特殊问题。根据我的说法,old.out 文件应该用我们使用 scanf 输入的任何内容写入,因为 fprintf 将输入分配给文件指针,但令我惊讶的是,我看到没有任何内容被写入 old.out,因为后面的 while 循环是没有被执行。这是怎么回事?这与我对 fprintf 函数的误解有关吗?我已经粘贴了下面的代码。

#include<stdio.h>
main()
{
    FILE *fp;
    char a;
    fp=fopen("old.out","w");
    if(fp==0)
        printf("File opening error");
    else
    {
        for(scanf("%c",&a);a!=EOF;scanf("%c",&a))
            fprintf(fp,"%c",a);
        fclose(fp);
        fp=fopen("old.out","r");
        while(!feof(fp))
            putchar(getc(fp));
    }
    return 0;
}

【问题讨论】:

  • int main()...
  • 像这样将复杂的表达式塞进你的for 通常被认为是不好的做法......
  • @OliCharlesworth:是的,我也觉得这很烦人,但在印度,大多数公司都会在校园面试的书面轮次中提出这样的问题。这也是adobe qualcomm写的一个这样的问题。如果我必须有资格参加面试,我只能准备这些问题。
  • @KavishDwivedi 不合逻辑。为什么你必须用一个过于复杂的解决方案来解决一个简单的问题?
  • @H2CO3:这个其实是高通笔试的题。我刚刚解决了他们的一篇论文,我被困在了这篇论文中。

标签: c io printf


【解决方案1】:

scanf() 在没有更多字符可读取时,不会将其参数设置为EOF。所以你的for 循环是一个无限循环。有两件事要改变:

  1. 不要做假设,而是阅读文档。

  2. 使用fgets() 而不是scanf()。 (忘记scanf()吧,毕竟它并没有像你想象的那样做,还有很多更好更友好的功能,尤其是对于初学者。)


“好的,好的,但我可以破坏密码?”

你可以:

#include <stdio.h>
#include <limits.h>
#include <assert.h>

int main()
{
    char buf[LINE_MAX];
    fgets(buf, sizeof(buf), stdin);

    FILE *fp = fopen("old.out", "w");
    assert(fp);
    fputs(buf, fp);
    fclose(fp);

    fp = fopen("old.out", "r");
    assert(fp);
    if (fgets(buf, sizeof(buf), fp))
        puts(buf);
    fclose(fp); 

    return 0;
}

【讨论】:

  • 嗯,是的,fgets 和 fputs 是更好的选择。
【解决方案2】:

有很多问题。

一方面,scanf() 不会分配 EOF,它会*返回* EOF。此外,EOF 不适合 char(它是 int 值),因此 a != EOF 很危险。此外,在执行 I/O 之前检查 feof() 也不是一个好主意。

【讨论】:

  • 谢谢。是的,我应该考虑过 EOF 不适合 char 。 Ritchie 已经明确建议要认真对待这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2014-09-22
  • 2019-03-25
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多