【发布时间】:2021-05-04 08:13:08
【问题描述】:
我一直在从一个文件中读取数据,该文件包含学生姓名和年龄,格式为:
约翰
12
简
13
朱莉娅
18
这是我写的程序:
#include <stdio.h>
#include <stdlib.h>
struct record{
char name[50];
int age;
};
int main(){
FILE *fp;
fp=fopen("sample2.txt","r");
struct record a[50];
int counter=1;
int i=0;
while (!EOF){
if (counter%2!=0){
fgets(a[i].name,50,fp);
counter++;
}
if (counter%2==0){
a[i].age=getw(fp);
counter++;
i++;
}
}
return 0;
}
但是,在打印 a[0].name 时,我没有得到预期的输出。有人可以帮忙吗?
【问题讨论】:
-
EOF是在<stdio.h>中定义的负常数,通常为-1。它不为零,所以它始终为真,!EOF始终为假——您的程序不会进入循环。读取年龄时还有另一个问题:getw读取(原始/二进制)机器字。用fgets读取一行,然后用strtol或atoi将其转换为整数。 -
'counter' 毫无意义。您应该检查 getw 的作用。假设“12”是文件中的 ascii 而不是一个单词,后跟一个换行符。 => 所以这是你的问题。你可以改用 fgets() + atoi()。最佳做法是在您阅读时使用特殊日志打印内容,以便您更清楚。
-
@MOehm 我明白了你的观点,但我不知道如何编辑 while 循环,以便只要未到达文件末尾,循环就可以工作。
-
@MOehm 我无法理解你所说的原始/机器字是什么意思
-
输入/输出有两种基本模式:原始或二进制数据和文本数据。您的文件是文本文件。文本数据使用
fprintf、fgets、fscanf等。使用fread和fwrite获取原始数据。getw是一个旧函数,它读取四个字节并将它们视为int,作为程序可能会将内存中的四个字节视为int。