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;
}

https://ideone.com/aCYJR5

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.

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