我有一个包含数据的文件,如示例所示:
text1 1542 542 6325 6523 3513 323
text2 1232 354 5412 2225 2653 312
text3 ....
...
我希望我的程序每隔一行读取和打印选定的数据,即只有第 3 列和第 4 列。所以我需要跳过开头的字符串“text1”,还要跳过该行中的其余列。我怎样才能做到这一点?
开始:
char buffer [512];
int lineNum = 0; // or 1, if you need the odd rather than even numbered lines
int col3, col4;
while (fgets (buffer, sizeof(buffer), inputFile) {
if (lineNum % 2) {
sscanf (buffer, "%*s %*d %d %d", &col3, &col4)
printf ("%d %d\n", col3, col4);
} // end if
lineNum++;
} // end while
没有尝试过,所以可能需要调试,但这样的东西应该可以工作。此外,这只是打印数字,但在现实生活中,您需要进行任何必要的处理,以防止这些数字被下一次读取覆盖。
您可以使用 strtok() 拆分指定分隔符的字符串(在本例中为空格)。
设置一个函数以根据需要跳过行,并设置一个掩码来标识要打印的列。
int FilterFile(FILE *inf, unsigned Row, unsigned ColumnMask) {
char buffer[1024];
unsigned RowCount = 0;
while (fgets(buffer, sizeof(buffer), inf) != NULL ) {
if ((++RowCount) % Row)
continue;
const char *s = buffer;
unsigned column = ColumnMask;
while (*s && column) {
int start, end;
sscanf(s, " %n%*s%n", &start, &end);
if (1 & column) {
printf("%.*s%c", end - start, &s[start], (column == 1) ? '\n' : ' ');
}
column >>= 1;
s = &s[end];
}
}
return 0;
}
int main() {
const char *path = "../src/text.txt";
FILE *inf = fopen(path, "rt");
if (inf) {
unsigned ColumnMask = 0;
ColumnMask |= 1 << (2-1); // Print column 2
ColumnMask |= 1 << (3-1); // Print column 3
unsigned RowSkip = 2; // Print every 2nd row
FilterFile(inf, RowSkip, ColumnMask);
fclose(inf);
}
return 0;
}
提示我能想到的最直接的答案:
跳过一行的最简单方法是调用fgets
并忽略获得的字符串。
要从一行中读取七个字符串(不包含空格),请使用:
scanf("%s %s %s %s %s %s %s\n", s1, s2, s3, s4, s5, s6, s7);
如果您想将某些视为数字,请替换%s
为%d
and,例如,s3
替换为&n3
。
要打印任何内容,只需使用printf
...
带有 * 修饰符的 scanf 会跳过那部分数据,所以在你的情况下
fscanf(FilePointer,"%s %*d %*d %d %d", &col3, &col4);
它将按照您的意愿读取第 3 列和第 4 列。
然后你用常规打印它们
printf("%d %d\n", col3, col4);