从文件中逐行读取整数,用空格分隔

时间:2017-10-25 13:16:07

标签: c

我非常困难,不知道从哪里开始我正在进行的项目。想法是从输入文件中读取数据(整数)。我们应该逐行读取每个整数。我们不能使用数组。只有循环。另外,我们应该忽略< 2整数的行(即下面例子中的第1行和第3行)。

输入文件的格式如下:

3
5 -5 0
5
1 -2 3 -4 5

这是我到目前为止(摘录):

while (fscanf(inFileHandle, "%d", &num) == 1) {
   //read in one number, add to sum
   sum += num;

   if (num > highest) {
      highest = num;
   }
   else if (num < lowest) {
      lowest = num;
   }
}

/* while ((c = (char)getc(inFileHandle)) != EOF) {
      if (c == ' ') {
         printf("space found");
      }
      else if (c == '\n') { //newline reached
      }
      else {
         printf("int found");
      }

   }*/

fclose(inFileHandle);

对于读入的数据,我们应该进行计算,但这不是这个问题的重点。

正如你所看到的,我有一个使用fscanf读取整数的while循环,但这并不完全是我想要的。如果行有两个或更多整数(如输入文件中的第2行和第4行),我只想读取整数。

我也尝试使用getc()一次读取一个字符,然后检查单个字符&#34; c&#34;,但我用这个想法达到了死胡同。

最好的开始方式是什么?

如果有什么不清楚,请告诉我。

2 个答案:

答案 0 :(得分:0)

外部循环将扫描两个项目int和char。当外循环扫描int和空格时,内循环将设置变量并继续扫描直到扫描int和换行符。

char ws = ' ';
int num = 0;

while ( result = fscanf ( inFileHandle, "%d%c", &num, &ws)) {
    if ( EOF == result) {
        break;
    }
    if ( 2 == result && ' ' == ws) {//scanned an int an a space
        sum = num;
        highest = num;
        lowest = num;
        while ( 2 == fscanf ( inFileHandle, "%d%c", &num, &ws)) {
            sum += num;
            if ( highest < num) {
                highest = num;
            }
            if ( lowest > num) {
                lowest = num;
            }
            if ( '\n' == ws) {//quit when a newline is scanned
                break;
            }
        }
        printf ( "sum is %d\n", sum);
        printf ( "highest is %d\n", highest);
        printf ( "lowest is %d\n", lowest);
    }
}

答案 1 :(得分:0)

如果不允许使用数组(包括作为char数组的字符串),则必须在一次char时读取该文件并手动构建整数值。要做到这一点,你需要一些状态变量来跟踪进度。

可能就像:

#include <stdio.h>
#include <string.h>
#include <limits.h>

int main(void) {
  int max = INT_MIN;
  int min = INT_MAX;
  int current;
  int numbersOnThisLine = 0;
  int parsingNumber = 0;
  int negative;
  int number = 0;
  int firstNumber;


  FILE* f = fopen("numbers.txt", "r");
  if (!f)
  {
    printf("file error\n");
    return 1;
  }

  while ((current = fgetc(f)) != EOF)
  {
    switch (current)
    {

      case '-':
          negative = 1;
          break;

      case ' ':
          if (parsingNumber)
          {
            if (negative) number = -number;
            printf("Found %d\n", number);
            ++numbersOnThisLine;
            if (numbersOnThisLine == 1)
            {
              firstNumber = number;
            }
            if (numbersOnThisLine >= 2)
            {
              if (firstNumber > max) max = firstNumber;
              if (firstNumber < min) min = firstNumber;
              if (number > max) max = number;
              if (number < min) min = number;
            }
          }
          parsingNumber = 0;
          number = 0;
          negative = 0;
          break;

      case '\n':
          if (parsingNumber)
          {
            if (negative) number = -number;
            printf("Found %d\n", number);
            ++numbersOnThisLine;
            if (numbersOnThisLine >= 2)
            {
              if (number > max) max = number;
              if (number < min) min = number;
            }
          }
          numbersOnThisLine = 0;
          parsingNumber = 0;
          number = 0;
          negative = 0;
          break;

      default:
          if (current > '9' || current < '0')
          {
            printf("Illegal file format\n");
            fclose(f);
            return 1;
          }
          parsingNumber = 1;
          number = 10 * number + (current - '0');
          break;
    }
  }
  fclose(f);

  printf("min=%d max=%d\n", min, max);
  return 0;
}

使用numbers.txt:

-12343
5 -5 -11 0
555
444 -2 343 -4 7

输出是:

Found -12343
Found 5
Found -5
Found -11
Found 0
Found 555
Found 444
Found -2
Found 343
Found -4
Found 7
min=-11 max=444

BTW 上面的代码实际上在printf中使用了char数组(也就是字符串) - 如果你也必须避免使用它,你可以使用putc进行打印。