【问题标题】:C reading text file and put content into structureC读取文本文件并将内容放入结构中
【发布时间】:2019-11-30 14:00:07
【问题描述】:

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

int int int char int char int char,例如:1 10 1 A 2 B 3 C

这意味着交货 id 是 1,月份是 10,我有 1 个价值 10 美元/件的 A,所以总共 10 美元,我有 2 个价值 20 美元/件的 B,所以 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;

numberofitems 为 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

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

【问题讨论】:

  • 示例1 10 1 A 2 B 3 C 的形式不是“int char int char int char”,除非您认为空间是一个字符,在这种情况下它的形式是“int char int” char int char char char int ...`
  • 在您示例的第二行中,有 2 个 F 值。这会在现实中发生还是这是一个错字?我们应该添加 F 吗?我会逐行读取文件,并使用strsep 在空格处分割行。然后,我将使用atoi 解码数值并与“A”、“B”、...进行比较以识别开关中的字母。
  • 对不起,这是一个错字,每个字符只能在一行中出现一次。

标签: c ansi-c


【解决方案1】:

我不是 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);
}

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多