Ошибки строки имени файла
У меня небольшие проблемы с приведенным ниже кодом, и я не могу на всю жизнь понять, что пошло не так и почему он показывает, что он делает, любая помощь или помощь будет наиболее ценной. Предполагается, что он позволяет вводить 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 ответа
Вот модифицированный код. добавленной 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;
}
Проблема в том, что scanf("%s", filename);
не использует новую строку после имени файла. Итак, ваш первый звонок gets()
читает эту новую строку как пустую строку.
Добавлять:
gets(string);
после этой строки, чтобы использовать оставшуюся часть строки, прежде чем вы начнете читать строки ввода.
Чтобы избавиться от новой строки в буфере сразу после вашего звонка scanf
Вы можете просто добавить getchar();
:
scanf("%s", filename);
getchar();
Но настройте циклы for так, чтобы они начинались с 0, так как вы добавляете 1 к n
то есть:
for(n=0;n<6;n++)
^
После внесения этих изменений я смог ввести 6 строк, а затем распечатать их все.
Как вы заметили, буферизованный ввод может быть неприятным, если вы не справитесь с ним должным образом, поскольку он может быть вставлен в ваши последующие входные вызовы. Не поддавайтесь искушению промыть stdin.
Вот некоторые рекомендуемые альтернативы, как с этим бороться.