C读取文本文件并将内容放入结构中

标签 c ansi-c

所以,我有一个文本文件,内容如下,用空格分隔:

int int int char int char int char,example: 1 10 1 A 2 B 3 C

这意味着交货 ID 是 1,该月的日期是 10,我有 1 个 A,值(value) 10 美元/件,所以总共 10 美元,我有 2 个 B,值(value) 20 美元/件,所以 2* 20$,依此类推,最大字符数为F,所以总共6个项目。我想把它放在一个数据结构上,但问题是并不是每行都提到每个字符,如果字符中有 0 则无论如何它都不在行上

1A 2C

上面的例子,0 B 因此该行中没有任何形式的 B。 我应该使用什么方法来处理文件并避免内存垃圾?我尝试使用 fscanf 但我不知道该行中有多少个字符。文件最多可以有1000行,我搜索了一下发现

while(!feof(file))

不是读取文件直到最后一行的可靠方法,我运行一个 For 循环来读取 1000 行并尝试分离垃圾,但它确实无效。 我的结构如下:

    typedef struct
{
    int id;
    int day;
    int numberofitems[6];

}asd;

A 的项数为 0,B 的项数为 1,C 的项数为 2 ... F 的项数为 5,

总的来说,txt 文件看起来像这样,但有更多行:

3 12 4 B 3 C 9 F 5 D
4 12 6 B 8 C 1 D 9 F 3 A
5 12 6 C 7 A 3 B

我应该如何处理这个文本文件?

最佳答案

我不是 scanf 的忠实粉丝,但您可以尝试以下操作:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#include <string.h>

struct asd {
        int id;
        int day;
        int numberofitems[6];
};

void die(const char *fmt, ... )  __attribute__ ((format (printf, 1, 2)));

int
main(void)
{
        char buf[1024];
        int line = 0;
        while( fgets(buf, sizeof buf, stdin) != NULL ) {
                int count;
                int len;
                char item;
                struct asd a = {0};
                char *p = buf;
                line += 1;
                if(sscanf(p, "%d %d%n", &a.id, &a.day, &len) != 2) {
                        die("Invalid input at line %d\n", line);
                }
                p += len;
                for(int i=0; i < 6 && sscanf(p, "%d %c%n", &count, &item, &len) == 2; i++ ) {
                        if( ! strchr("ABCDEF", item) ) {
                                die("Invalid input at line %d\n", line);
                        }
                        a.numberofitems[item - 'A'] = count;
                        p += len;
                }
                printf("id = %d, day = %d\n", a.id, a.day);
                for(int i=0; i < 6; i++) {
                        printf("\tnum[%c] = %d\n", 'A' + i, a.numberofitems[i]);
                }
        }
}

void
die(const char *fmt, ... )
{
        va_list ap;
        va_start(ap, fmt);
        vfprintf(stderr, fmt, ap);
        va_end(ap);
        exit(1);
}

关于C读取文本文件并将内容放入结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116874/

相关文章:

c# - 使用 C# 进行 Ansi C 编程还是以 C# 方式编程?

c - 如何抑制 int main(void) 函数的 PC-Lint Note 970?

c - 访问结构体和 union 体中的元素

c - 我猜函数有一些错误

ISO C89 中的函数调用计数

c - 将输入文本中的十六进制值保存到字符串 var,反之亦然 ANSI C

c - 什么占用了更多的 FLASH 空间?静态变量或全局变量

从 mongoose begin_request_handler 回调调用函数

c++ - FindBLAS 和 FindLAPACK 在 CMake 中的使用

c - 引擎功能 : Calling MATLAB from a C application