我正在尝试读取一个文件,该文件包含以#开头的几行信息,然后是数据列表。我需要对这些数据进行排序并计算行数,找到几列中最高的列数,并打印我找到的每种文件类型的数量。除此之外,我需要避免空白行。示例文件为:
# Begin
# File | Popularity | Uses | Name
asdf.exe | 4 | 280 | asdf
firefox.exe | 1 | 3250 | firefox.exe
image.png | 2 | 2761 | image
start | 5 | 100 | start
font.txt | 6 | 20 | font
smile.txt |3 | 921 |smile
注意:| 代表长度不确定的空格
我在尝试解释列之间的空格以及分隔每行内的整数和字符串以及考虑 # 和空白行时遇到了很多麻烦,所以我真的很感激任何建议,因为我被卡住了。我不想要任何实际的代码,而是想法开始。
您应该使用 fgets
从文件中读取行。您可以检查行的第一个字符是否'#'
或'n'
并相应地对其进行处理。
// max length of a line in the file
#define MAX_LEN 100
char linebuf[MAX_LEN];
// assuming the max length of name and filename is 20
char filename[20+1]; // +1 for the terminating null byte
char name[20+1]; // +1 for the terminating null byte
int p; // popularity
int u; // uses
FILE *fp = fopen("myfile.txt", "r");
if(fp == NULL) {
printf("error in opening filen");
// handle it
}
while(fgets(linebuf, sizeof linebuf, fp) != NULL) {
if(linebuf[0] == '#' || linebuf[0] == 'n')
continue; // skip the rest of the loop and continue
sscanf(linebuf, "%20s%d%d%20s", filename, &p, &u, name);
// do stuff with filename, p, u, name
}
请注意,格式字符串中的%d
转换说明符读取并丢弃任意数量的前导空格字符。
使用它来跳过注释行:
while(fscanf(file, "%1[#]%*[^n]n") > 0) /**/;
然后使用它来读取一行:
int ret = fscanf(file, "%s %d %d %sn" ...)
阅读任何行后,重复注释芒格。