Ошибки строки имени файла

У меня небольшие проблемы с приведенным ниже кодом, и я не могу на всю жизнь понять, что пошло не так и почему он показывает, что он делает, любая помощь или помощь будет наиболее ценной. Предполагается, что он позволяет вводить 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("%s", имя файла) на get (имя файла)

Чтобы избавиться от новой строки в буфере сразу после вашего звонка scanfВы можете просто добавить getchar();:

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

Но настройте циклы for так, чтобы они начинались с 0, так как вы добавляете 1 к n то есть:

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

После внесения этих изменений я смог ввести 6 строк, а затем распечатать их все.

Как вы заметили, буферизованный ввод может быть неприятным, если вы не справитесь с ним должным образом, поскольку он может быть вставлен в ваши последующие входные вызовы. Не поддавайтесь искушению промыть stdin.

Вот некоторые рекомендуемые альтернативы, как с этим бороться.

Другие вопросы по тегам