【问题标题】:File name string errors文件名字符串错误
【发布时间】:2013-06-20 03:26:18
【问题描述】:

我在使用下面的代码时遇到了一点问题,我一生都无法弄清楚出了什么问题以及为什么它会显示它的作用,任何帮助或帮助将不胜感激。它应该允许输入 5 行文本并在屏幕上显示这 5 行,但是它只允许输入 4 行,并显示 4 行。请帮忙!

#include <stdio.h>

int main()
{
char string[100];
char filename[20];
int n=0;
FILE *fp;
printf(" Enter the name of file to open ");
scanf("%s",filename);
fp =fopen(filename,"wr");
if(fp==NULL)
{
    printf("unable to open File");
}
for(n=1;n<6;n++)
{
    printf("\nEnter line %d:",n+1);
    gets(string);
    fputs(string,fp);
    fputs("\n",fp);
}
fclose(fp); /*close the file*/
fp =fopen(filename,"r");
if(fp==NULL)
{
    printf("unable to open File");
}
for(n=1;n<6;n++)
{
    fgets(string,100,fp);
    printf("%s",string);
}
fclose(fp); // close after reading.
return 0;
}

【问题讨论】:

  • 首先要做的是使用基于 0 的循环而不是基于 1 的循环(对于 C 类型语言来说更自然 - 我注意到你已经有一个 n+1 看起来它假设一个基于 0 的循环)。除此之外,它看起来应该可以工作。尝试在第一个循环之后打印n,看看它达到了 6...
  • @John3136 他没有使用任何数组,除了几个他没有索引的字符串。
  • 如果您在每次迭代后fflush(stdout) 会发生什么?
  • @n3rd4n1 为什么有必要这样做?他在关闭文件之前不会读取文件,这将刷新所有内容。
  • @Barmar:注意我说的是stdout 而不是fp 文件。

标签: c string file fputs


【解决方案1】:

问题是scanf("%s", filename); 不使用文件名后的换行符。因此,您第一次调用 gets() 时会将这个换行符读取为空行。

添加:

gets(string);

在开始读取输入行之前用完该行的其余部分。

【讨论】:

    【解决方案2】:

    这是修改后的代码。添加gets 而不是scanf,如果文件未打开,则添加return 0;

    #include <stdio.h>
    
    int main()
    {
    char string[100];
    char filename[20];
    int n=0;
    FILE *fp;
    printf(" Enter the name of file to open ");
    gets(filename);
    fp =fopen(filename,"wr");
    if(fp==NULL)
    {
        printf("unable to open File");
        return 0; // do not proceed
    }
    for(n=1;n<6;n++)
    {
        printf("\nEnter line %d:",n);
        gets(string);
        fputs(string,fp);
        fputs("\n",fp);
    }
    fclose(fp); /*close the file*/
    fp =fopen(filename,"r");
    if(fp==NULL)
    {
        printf("unable to open File");
        return 0; // do not proceed
    }
    for(n=1;n<6;n++)
    {
        fgets(string,100,fp);
        printf("%s",string);
    }
    fclose(fp); // close after reading.
    return 0;
    }
    

    【讨论】:

      【解决方案3】:

      将 scanf("%s",filename) 替换为 gets(filename)

      【讨论】:

        【解决方案4】:

        要在调用scanf 后立即删除缓冲区中的换行符,您只需添加getchar();

        scanf("%s", filename); 
        getchar();
        

        但请调整您的 for 循环以从 0 开始,因为您将 1 添加到 n 即:

        for(n=0;n<6;n++)
              ^
        

        进行这些更改后,我可以输入 6 行,然后将它们全部打印出来。

        正如您所注意到的,如果您处理不当,缓冲输入可能会令人讨厌,因为它可以插入到您后续的输入调用中。 Don't be tempted to flush the stdin.

        Here 是一些关于如何处理此问题的推荐替代方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-15
          • 2014-05-29
          • 2017-08-06
          相关资源
          最近更新 更多