0

我在使用下面的代码时遇到了一点问题,我一生都无法弄清楚出了什么问题以及为什么它会显示它的作用,任何帮助或帮助将不胜感激。它应该允许输入 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;
}
4

4 回答 4

2

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

添加:

gets(string);

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

于 2013-06-20T03:43:33.493 回答
1

这是修改后的代码。如果文件未打开,则添加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;
}
于 2013-06-20T03:48:30.103 回答
0

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

于 2013-06-20T03:42:59.223 回答
0

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

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

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

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

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

正如您所注意到的,如果您没有正确处理缓冲输入,它可能会令人讨厌,因为它可以插入到您后续的输入调用中。不要试图刷新标准输入。

以下是一些有关如何处理此问题的推荐替代方案。

于 2013-06-20T04:03:03.600 回答