C: запись / чтение файлов с использованием цикла do while
Я пишу простое приложение для упражнений на C, которое должно спрашивать пользователя, хочет ли он что-то записать в файл или прочитать файл. Я хочу дать имя файлу, а затем ввести текст в консоли. Я хочу использовать этот текст, чтобы сохранить его в файл.
Проблема в том, что, когда я уже дал имя файлу, я не могу вводить данные в консоль и этим не могу сохранить эти данные в текстовый файл. Кроме того, цикл while игнорирует мое 'y' для повторного запуска программы. Кроме того, когда я хочу использовать чтение файла, тогда это действительно так, программа работает, но она также добавляет инструкцию по умолчанию (печать просто ошибка), но я не хочу этого, просто только читаю из файла и печатаю его на консоль.
Может кто-нибудь объяснить мне, что я делаю не так и как это решить? Я был бы благодарен.
Вот мой код:
int main()
{
FILE *file;
char nameFile[32];
char string[500];
char ans[2];
int choice;
do{
printf("What do you want to do?\n");
printf("1. Write text to file\n");
printf("2. Read text file\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Give name to the file (*.txt).\n");
scanf("%s", nameFile); //This line skips me to line where program ask user if restart the program (I have no idea why :()
system("clear");
file=fopen(nameFile, "w");
if(file!=NULL){
printf("Input text:\n");
scanf("%[^\n]", string); //<--- HERE I'cant input text to console, seems like scanf doesn't work.
fprintf(file, "%s", string);
printf("\n\t\t\t-----------Ended writing.------------\n");
fclose(file);
}
else
{
printf("Could not open the file.");
return -1;
}
break;
case 2:
printf("Give name to the file (*.txt)");
scanf("%s", nameFile);
system("clear");
file=fopen(nameFile, "r");
if(file!=NULL){
while (!feof(file)) {
fscanf(file, "%s", string);
printf("%s\n",string); //After printing data from text file, adds instruction from line , and that is printing Error. How to get rid of it?
}
}
else{
printf("Could not open the file.");
return -1;
}
default:
printf("Error.");
break;
}
printf("Do you want to restart the program? (y/*)"); //Even if I write 'y', program ends anyway :(
scanf("%s", ans);
}
while(ans=='y');
return 0;
}
2 ответа
scanf("%[^\n]", string);
не работает, если входной буфер не очищен. Используйте вместо scanf("%499s", string)
где 499
размер строки минус 1.
Не использовать while (!feof(file)){...}
используйте вместо while(fscanf(file, "%500s", string) == 1){...}
использование while(ans[0]=='y')
как предлагалось ранее. Или использовать
char ans;
scanf(" %c", &ans);//note the blank space before `%c`
while(ans == 'y')
Вы также забыли нарушить оператор switch. Попробуйте следующее:
char c;
char ans;
do {
printf("What do you want to do?\n");
printf("1. Write text to file\n");
printf("2. Read text file\n");
scanf("%d", &choice);
switch(choice) {
case 1:
printf("Give name to the file (*.txt).\n");
scanf("%s", nameFile);
file = fopen(nameFile, "w");
if(file == NULL) { printf("Could not open the file."); return -1; }
printf("Input text:\n");
while((c = getchar()) != '\n' && c != EOF);
fgets(string, sizeof(string), stdin);
string[strcspn(string, "\r\n")]=0;
fprintf(file, "%s", string);
printf("\n\t\t\t-----------Ended writing.------------\n");
fclose(file);
break;
case 2:
printf("Give name to the file (*.txt)");
scanf("%s", nameFile);
file = fopen(nameFile, "r");
if(file == NULL) { printf("Could not open the file."); return -1; }
while(fgets(string, sizeof(string),file))
printf("%s\n", string);
fclose(file);
break;
}
printf("Do you want to restart the program? (y/*)");
scanf(" %c", &ans);
} while(ans == 'y');
Смотрите также
Почему "while (! Feof (file))" всегда неверно?
Как очистить входной буфер в C?
Ваше время должно быть
while(ans[0]=='n');
Массив char - это строка, вы пытаетесь сравнить всю строку с символом 'y'. Кроме того, он должен "Цикл, в то время как ans[0] равен " n "", то есть продолжать работать, если пользователь указывает n.