我需要使用 C 读取文件。
#include <stdio.h>
struct record{
char name[2];
int arrival_time;
int job_length;
int job_priority;
};
const int MAX = 40;
main(){
struct record jobs[MAX];
FILE *f;
fopen("data.dat","rb");
int count =0;
while(fscanf(f, "%c%c %d %d %d", &jobs[count].name, &jobs[count].arrival_time, &jobs[count].job_length, &jobs[count].job_priority) != EOF){
count++;
}
int i;
for(i =0;i<count;i++){
printf("%c%c %d %d %d", &jobs[count].name, &jobs[count].arrival_time, &jobs[count].job_length, &jobs[count].job_priority);
}
}
数据文件的格式如下:
A1 3 3 3
B1 4 4 4
C1 5 5 5
...
第一个是char[2],另外三个是int。直到文件末尾,我才能正确读取代码。
以前有人遇到过这个吗?
更新代码。
最佳答案
需要进行一些修改 - 最值得注意的是,您需要引用结构的 jobs
数组:
#include <stdio.h>
struct record{
char name[2];
int arrival_time;
int job_length;
int job_priority;
};
const int MAX = 40;
int main(void)
{
struct record jobs[MAX];
int i = 0;
int j;
FILE *f = fopen("data.dat","rb");
while (fscanf(f, "%c %d %d %d", &jobs[i].name[0], &jobs[i].arrival_time,
&jobs[i].job_length, &jobs[i].job_priority) == 4 && i < MAX)
i++:
for (j = 0; j < i; j++)
printf("%c %d %d %d\n", jobs[j].name[0], jobs[j].arrival_time,
jobs[j].job_length, jobs[j].job_priority);
return(0);
}
我确保循环不会溢出数组。我将数据打印出来(这是检查您是否阅读了预期内容的最基本形式)。最微妙的问题是 jobs[i].name[0]
的使用;这是读取和打印单个字符所必需的。不能保证 jobs[i].name[1]
中有任何特定值;特别是,它很可能不是 NUL '\0'
,因此名称不是空终止的。使用单个字符名称似乎有点奇怪;您可能希望结构中有更长的字符串:
char name[MAX]; // Lazy reuse of MAX for two different purposes!
fscanf(f, "%.39s ...", jobs[i].name, ...
printf("%s ...", jobs[i].name, ...
现在不需要 &
了。 %.39s
符号用于读取长度限制的字符串,直到第一个空格。请注意,字符串中的大小比数组的大小小一。通常最简单的方法是使用 sprintf()
创建格式字符串以获得正确的大小。
代码不会对 fopen()
语句进行错误检查。
Your code prints out A 1 3 3 instead of A1 3 3 3. I tried to add a second %c to it and it did not resolve it.
我讨论了超过一个字符的名字...
如果你需要读取“A1”,你需要name
成员更大,这样你就可以空终止字符串,你需要使用%s
而不是 %c
来读取值,你需要丢失 &
和下标,你需要保护你的代码免受缓冲区溢出(因为你期望 'A1 ',如果您不防止缓冲区溢出,则不可避免地会有人输入 'A1B2C3D4D5F6G7H8I9J10K11L12M13' 并对您的代码造成严重破坏。顺便说一下,fscanf()
测试结果的变化(来自 == EOF
到 != 4
也是一种防止格式错误的输入的保护措施;通常,您可以在不读取任何字符的情况下获得零成功转换 - 尽管您的 %c
每次迭代都会吃掉一个字符)。
#include <stdio.h>
struct record{
char name[4];
int arrival_time;
int job_length;
int job_priority;
};
const int MAX = 40;
int main(void)
{
struct record jobs[MAX];
int i = 0;
int j;
FILE *f = fopen("data.dat","rb");
while (fscanf(f, "%.3s %d %d %d", jobs[i].name, &jobs[i].arrival_time,
&jobs[i].job_length, &jobs[i].job_priority) == 4 && i < MAX)
i++:
for (j = 0; j < i; j++)
printf("%s %d %d %d\n", jobs[j].name, jobs[j].arrival_time,
jobs[j].job_length, jobs[j].job_priority);
return(0);
}
关于c - 从 C 文件中读入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857882/