c - 从 C 文件中读入

标签 c

我需要使用 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/

相关文章:

c - 为什么我们要选择自动类型存储类?

c - 为什么声明的原型(prototype)的函数类型不需要与实际函数的类型匹配?

c++ - 简单的C/C++问题

c - 根据用户输入重复while循环

c - 如何将 `SInt16' 转换为 `double'?

c - 删除视频的某些部分并重新制作关键帧(c++ + libav)

c - 检测在 C 中按下了哪个键

从 token 和宏的串联创建类似对象的宏

c - C 中的 BST 链表 : Breadth First Search

c - 为什么这个条件总是成立?