fprintf в do while цикл написал только одну строку в файле C

-5

Я не знаю, почему он пишет только одну строку в моем файле

void foo()
{
int ID;
char answer;
FILE *input = fopen("Dane.txt", "w");

do
{
printf("Give ID: ");
scanf("%d",&ID);
fprintf(input, "%d\n", ID);
printf("Exit? y/n ");
scanf("%s", &answer);
fflush(NULL);

}
while (answer != 'n');

fclose(input);
}

Вывод (в файле) - это только первый идентификационный номер, который я пишу на консоли. Но где другие?

EDIT: Хорошо, я понял. Ошибка была в char answer и это должен быть char answer[2] и окончание пока должно быть while(answer[0] !=...). Перед ним программа считывает только один символ - конец строки. Когда я нажимаю, например, "n ENTER", он принимает только ENTER. Теперь он берет первый символ из табуляции, т.е. "N". Спасибо всем за помощь

спросил(а) 2021-01-25T18:59:24+03:00 4 месяца, 4 недели назад
1
Решение
63

    answer имеет только одно пространство для чтения, и он не способен хранить строку длиной 1 символ или дольше. Это не повлияет на результат, но использование input для указателя выходного файла сбивает с толку. Условие в while как неестественно.

Попробуй это:

#include <stdio.h>

void foo();
int main() {foo(); return 0;}

void foo()
{
int ID;
char answer[4];
FILE *output = fopen("Dane.txt", "w");
if (output == NULL) return;

do
{
printf("Give ID: ");
if (scanf("%d",&ID) != 1) break;
fprintf(output, "%d\n", ID);
printf("Exit? y/n ");
if (scanf("%3s", answer) != 1) break;
fflush(NULL);

}
while (answer[0] != 'y');

fclose(output);
}

ответил(а) 2021-01-25T18:59:24+03:00 4 месяца, 4 недели назад
63

Вы делаете какую-то логическую ошибку. Вы спрашиваете, выходите или нет. Если пользователь не хочет выходить, он нажимает n. Итак, чтобы продолжить цикл, ответ должен быть равен n, правильно?

Модифицированная версия вашей программы:

void foo()
{
int ID;
char answer;
FILE *input = fopen("Dane.txt", "w");

do
{
printf("Give ID: ");
scanf("%d",&ID);
fprintf(input, "%d\n", ID);
printf("Exit? y/n ");
scanf(" %c", &answer);
fflush(NULL);

}
while (answer == 'n');

fclose(input);
}

ответил(а) 2021-01-25T18:59:24+03:00 4 месяца, 4 недели назад
64

Когда я запустил вашу функцию, я получил все три числа, которые я ввел в файл:

$ ./a.out
Give ID: 25
Exit? y/n y
Give ID: 33
Exit? y/n y
Give ID: 10
Exit? y/n n
$ cat Dane.txt
25
33
10

Однако ваш вопрос обратный. Вы спрашиваете: "Выйти? Y/n", а затем выйти, если ответ "n" ("нет"). Вопрос должен быть "Продолжить? Y/n", так что, когда пользователь отвечает утвердительно, он продолжается.

Кроме того, название вашего входного дескриптора файла "вход" обратное, и, как указывали другие, ваша переменная answer должна быть массивом символов не менее 2 символов, как char answer[2]; ,

ответил(а) 2021-01-25T18:59:24+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема