仅从文件中读取所选数据

时间:2013-09-04 21:20:16

标签: c file input

我有一个文件,其数据如下所示:

    text1 1542 542 6325 6523 3513 323
    text2 1232 354 5412 2225 2653 312
    text3 ....
    ...

我希望我的程序只读取和打印所选数据,即每隔一行只打印第3和第4列。所以我需要在开头跳过字符串“text1”,还要跳过行中的其余列。我怎么能这样做?

5 个答案:

答案 0 :(得分:0)

您可以使用strtok()来分割指定分隔符的字符串(在本例中为空格)。

答案 1 :(得分:0)

提示我能想到的最简单的答案:

  1. 跳过一行的最简单方法是拨打fgets并忽略 获得了字符串。

  2. 要从一行读取七个字符串(不包含空格),请使用:

    scanf("%s %s %s %s %s %s %s\n", s1, s2, s3, s4, s5, s6, s7);
    

    如果您想将某些内容视为数字,请将%s替换为%d,将s3替换为&n3

  3. 要打印任何内容,只需使用printf ...

答案 2 :(得分:0)

scanf with * modifier会跳过那部分数据,所以在你的情况下做

fscanf(FilePointer,"%s %*d %*d %d %d", &col3, &col4);

它将按您的意愿阅读第3列和第4列。

然后用常规

打印它们
printf("%d %d\n", col3, col4);

答案 3 :(得分:0)

这里是:

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

没试过,所以可能需要调试,但这样的事情应该有效。此外,这只是打印数字,但在现实生活中,您需要做任何处理,以防止下次读取时覆盖这些数字。

答案 4 :(得分:0)

设置一个功能,根据需要跳过行,并设置一个掩码,以识别要打印的列。

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;
}