提问人:noRobotNoPro 提问时间:12/3/2022 更新时间:12/3/2022 访问量:275
使用 while-loop 和 getw(f) != EOF 从 C 语言中的文件中读取整数
Reading integers from a file in C using a while-loop and getw(f) != EOF
问:
我对 C 很陌生,或者说,对 C 很陌生。我尝试使用 putw() 将整数写入文件,然后尝试使用 getw() 读取它们,我使用 while 循环读取它们,直到 EOF。但是循环过早地死了,当 getw() 从文件中获取整数 26 时,它似乎会这样做。我完全不知所措。
基本上,我想使用 putw() 打印之前保存到文件中的整数,每 7 次迭代我打印一行新行。它一直工作,直到 getw() 遇到整数 26,这会终止循环,即使它不是 EOF。无论文件中有多少个整数,它都只能在 getw() 遇到 26 之前工作。我尝试过使用 fscanf,但也没有让它起作用。请帮助初学者。
void readfile() {
FILE *f;
f = fopen("INTEGERS.DAT", "r");
int num, xar=1;
if (f==NULL){
printf("NO file detected.\n");
exit(0);
} else {
while((num = getw(f)) != EOF) {
printf("%d ", num);
if ( xar % 7 == 0) {
printf("\n");
}
xar++;
}
}
fclose(f);
}
提前致谢。
答:
1赞
NoDakker
12/3/2022
#1
您没有指明数据文件的格式,但请注意您正在使用“r”参数打开文件,这将指示文件中的数据是文本格式,而不是二进制格式。因此,利用这些信息和一些艺术许可,我创建了一个代码片段来构建一些文本数据,其中每行/记录的整数值,然后使用readfile函数的调整版本读取该文件中的数据。
#include <stdio.h>
#include <stdlib.h>
void save_int(void)
{
int entry = 999;
FILE *fp;
fp = fopen("INTEGERS.DAT", "w");
if (fp != NULL)
{
while (1)
{
printf("Enter an integer or enter '0' to quit data entry: ");
scanf("%d", &entry);
if (entry == 0)
{
break;
}
fprintf(fp, "%d\n", entry);
}
}
fclose(fp);
return;
}
void readfile()
{
FILE *fp;
fp = fopen("INTEGERS.DAT", "r");
char number[16];
int value;
if (fp==NULL)
{
printf("NO file detected.\n");
exit(0);
}
else
{
while(1)
{
value = fscanf(fp, "%s", number);
if (value < 0)
{
break;
}
printf("%d ", atoi(number));
}
}
printf("\n");
fclose(fp);
}
int main()
{
save_int();
readfile();
return 0;
}
需要指出的一些项目。
- 每个整数值都使用换行符写入文本文件,因此,如果您的文件实际上采用不同的格式,例如将整数存储在同一行上,并在整数值之间使用某种类型的分隔符,这将是一个警告。
- 在从创建的文本文件中读取整数数据时,fscanf 用于此任务 - 您可能会使用其他函数(如 fget)获得建议和其他答案。有利有弊,所以通常归结为你最熟悉和最舒服的东西。
- 由于这些值存储为字符串值,因此它们被读入字符串,然后使用标准 atoi 函数转换为整数。同样,这只是我熟悉的一种简单方法。请务必查看您可能获得的任何替代答案和/或稍后添加到此答案的评论。
有了这个,以下是终端的一些示例输出。
@Dev:~/C_Programs/Console/Integers/bin/Release$ ./Integers
Enter an integer or enter '0' to quit data entry: 14
Enter an integer or enter '0' to quit data entry: 566
Enter an integer or enter '0' to quit data entry: 65335
Enter an integer or enter '0' to quit data entry: 122
Enter an integer or enter '0' to quit data entry: 18
Enter an integer or enter '0' to quit data entry: 0
14 566 65335 122 18
@Dev:~/C_Programs/Console/Integers/bin/Release$ cat INTEGERS.DAT
14
566
65335
122
18
继续测试一下,看看它是否符合你的项目精神。
评论
0赞
chux - Reinstate Monica
12/3/2022
注意:无限循环应返回非 1。scanf("%d", &entry);
0赞
chux - Reinstate Monica
12/3/2022
fscanf(fp, "%s", number);
最好是.fscanf(fp, "%15s", number);
评论
EOF
wint_t
getw
putc
getc
f = fopen("INTEGERS.DAT", "rb");
"wb
getw
,与宽字符或 Unicode 无关。