所以,我有一个文本文件,内容如下,用空格分隔:
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/