do while 循环中的 fprintf 在文件 C 中只写了一行
fprintf in do while loop wrote only one line in file C
我不知道为什么它在我的文件中只写了一行
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);
}
输出(在文件中)只是我在控制台上写的第一个 ID 号。但是其他人呢?
编辑:好的,我知道了。错误在 char answer
中,应该是 char answer[2]
,结束时应该是 while(answer[0] != ...)
。在它之前,程序只读取一个字符——行尾。当我打例如"n ENTER" 只需 ENTER。现在它从选项卡中获取第一个字符,即 "n"。谢谢大家的帮助
当我 运行 你的函数时,我得到了我在文件中输入的所有三个数字:
$ ./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
但是,你的问题倒退了。你问 "Exit? y/n" 然后如果答案是 "n" ("no") 就退出。问题应该是 "Continue? y/n",这样当用户回答肯定时,它会继续。
此外,将输出文件句柄命名为 "input" 是倒退的,正如其他人提到的,您的 answer
变量应该是至少包含 2 个字符的字符数组,如 char answer[2];
。
你犯了一些逻辑错误。你在问是否退出。如果用户不想退出,那么他会按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);
}
answer
只有一个 space 可以读取,它无法存储长度为 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);
}
我不知道为什么它在我的文件中只写了一行
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);
}
输出(在文件中)只是我在控制台上写的第一个 ID 号。但是其他人呢?
编辑:好的,我知道了。错误在 char answer
中,应该是 char answer[2]
,结束时应该是 while(answer[0] != ...)
。在它之前,程序只读取一个字符——行尾。当我打例如"n ENTER" 只需 ENTER。现在它从选项卡中获取第一个字符,即 "n"。谢谢大家的帮助
当我 运行 你的函数时,我得到了我在文件中输入的所有三个数字:
$ ./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
但是,你的问题倒退了。你问 "Exit? y/n" 然后如果答案是 "n" ("no") 就退出。问题应该是 "Continue? y/n",这样当用户回答肯定时,它会继续。
此外,将输出文件句柄命名为 "input" 是倒退的,正如其他人提到的,您的 answer
变量应该是至少包含 2 个字符的字符数组,如 char answer[2];
。
你犯了一些逻辑错误。你在问是否退出。如果用户不想退出,那么他会按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);
}
answer
只有一个 space 可以读取,它无法存储长度为 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);
}