2017-10-25 7 views
-1

私が取り組んでいるプロジェクトがどこから始まるのかよく分かりません。この考え方は、入力ファイルからデータ(整数)を読み込むことです。私たちは各整数を1行ずつ1行ずつ読み込むことになっています。配列は使用できません。ループのみ。空白で区切られた1行単位のファイルからの整数の読み込み

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

これは私がこれまでに(持っているものされています。また、我々は、入力ファイルは、次のようにフォーマットされ

< 2の整数(下記の例では、すなわちライン1と3)で行を無視する必要がありますスニペット):

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つ以上の整数がある場合(入力ファイルの行2と行4のように)、整数で読み込みたいだけです。

また、getc()を使って一度に1文字ずつ読み込み、個々のchar "c"をチェックしようとしましたが、そのアイデアで枯渇しました。

どのような方法で開始するのですか?

不明な点がある場合は、お知らせください。

+1

[Cのファイルからintの行を読み取る]の可能な複製(https://stackoverflow.com/questions/28871314/readrows-of-ints-from-a-file-in-c) –

+0

2つよりも少ない整数の行を無視するという要件のために、 'fscanf()'を簡単に使うことはできません。 'fscanf()'は、入力フィールドを区切るすべての空白を、改行を含めて同じものとして扱います。あなたは 'fgets()'で一度に行を読み込み、 'sscanf()'を使うことができますが、あなたの入力フォーマットはかなりシンプルなので、実際には文字単位で動作するパーサを書く方が簡単かもしれません。 –

+0

あなたの質問を完全に理解するには:行に5つの整数があれば、5つの整数をすべて読み込む必要がありますか? – 4386427

答えて

0

外側ループは、intとcharの2つの項目をスキャンします。外部ループが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); 
    } 
} 
0

、一度にファイル1つの文字を読み、手動で整数値を構築する必要があります。これを行うには、進行状況を追跡するためにいくつかの状態変数が必要です。

それは次のようであり得る:出力される

-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コードが実際に文字列を使用するようにnumbers.txtで

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

printfの中の文字列(別名文字列) - それを避ける必要がある場合また、印刷にはputcを使用することもできます。

関連する問題