2017-03-06 2 views
0

こんにちは私はこのコードをtxtの浮動小数点数の読み込みに使用しています。 txtファイルの末尾がある場合は、余分な空白空白行プログラムは、それを0.00000読み込み、これが私の計算に影響Last empty line最後の余分な空行を検出してCで無視する方法(getcを使用)

を(#計算の終わりを意味し、それは更新コメント行を存在する場合、私はコメント行を追加しました)

私は「getlineのを試してみてください"と他の機能は、私はそれが

fptr = fopen(fileName,"r+"); 
    if(fptr == NULL){ 
     printf("Error!! Cannot open file: %s \n", fileName); 
     return 1; 
    } 
    else { 
     printf("File opened successfully\n"); 
     while((c = getc(fptr)) != '#' && c != EOF) {  

      fscanf(fptr,"%f" ,&arr[i]);  
      ++i; 
     } 
    } 
+1

私は 'fscanf'と' getc'を同じループに混ぜません。これには理由がありますか? – Dai

+1

あなたのコードはとにかく意味がありません、あなたはそれを説明しようとすることができますか? –

+0

'ungetc'が必要です。例えば、ungetc(c、fptr); – BLUEPIXY

答えて

4

チェックfscanfの戻り値を修正することはできません - それは成功し、その空白行の数と0を読み込むとき、それは1を返す必要があります。

+1

"0その空白行に。 - その最後の_blank行で 'EOF'でないことを確認しますか? – chux

+0

返り値を確認する方法fscanf()を試してみましたが動作していません – YlmzCmlttn

+0

@chux最後の空白行にEOFがある場合 – YlmzCmlttn

1

OPは、ファイルを読み込む行ずつと4つの成果持っている:

  1. 番号に変換成功を。
  2. 行は#または空白で始まります。
  3. これ以上の入力(ファイルの終わり)はありません。
  4. 他にもあります。

新しいアプローチを提案してください:行単位でテキストをテキストとして読み込み、さまざまな解析を試みてください。成功を判断するために、戻り値*scanf()を確認することが重要です。

printf("File opened successfully\n"); 
    float /* or double */ arr[N]; 
    size_t i = 0; 
    char buffer[100]; 

    while (fgets(buffer, sizeof buffer, fptr)) { 
    double x; 
    char sof[2]; 
    if (sscanf(buffer, "%lf" ,&x) == 1) { 
     if (i < N) { 
     arr[i++] = x; 
     } else { 
     puts("No room"); 
     } 
    } else if (sscanf(buffer, "%1s" , sof) != 1 || sof[0] == '#') { 
     ; // quietly ignore white-space only lines and that begin with # 
    } else { 
     puts("Unexpected input"); 
    } 
    } 
    fclose(fptr); 
    puts("Done"); 
関連する問題