2016-12-19 9 views
3

私は宿題に取り組んでいます。私の理解の範囲を超えて作業する私のコードの問題の一部に悩まされています。私は多くのフォーラムを検索し、問題を克服するために他のアプローチを試みましたが、解決策を見つけることができませんでした。これは私のコードの削減問題の一部である...ファイルからの読み込みで奇妙な問題が発生する

while(!feof(transmissionsFile)){ 
     int ret = fscanf(transmissionsFile, "%c %c %d", &tTms.tsn, &tTms.rsn, &tTms.sTime); 
     if(ret != 3) continue; 

     for(s = 0; s < N; ++s){ 
      if(tmsMtx[s][tTms.sTime].tsn == ' '){ 
       tmsMtx[s][tTms.sTime] = tTms; 
       break; 
      } 
      continue; 
     }  
    } 

私が読んでいるファイルは、単純なテキストファイルです:

A B 3 
C B 2 
C A 1 
B A 2 
A C 3 
B C 4 

が、私は、ファイルを読み込むしようとしたとき、それが唯一の読み込み

A B 3 
C A 1 
A C 3 

私もまったく同じ形式Fを使用しています、私は「RET」機能の戻り値をチェックしていると私は読んでそれがもののために3を返していることがわかり、未読のもののために二回回2 ... または他の構造にデータを完全に読み込む...私は行方不明のものがいくつかあるに違いないが、私はそれを理解できない。私はどんな指針もありがとうと思います:

これは私がこの問題を解決するために書いたコード全体です。この部分はトランジションマトリクスを作成し、マトリクスを埋めるために値を読み取るべきです。例:ファイルの1行目のT3のA〜B ...

#include <stdio.h> 

int main() { 

    int N = 5; 
    // Opening required files ############################################  
     FILE *transmissionsFile = fopen("transmissions.txt", "r"); 
    if (transmissionsFile == 0) { 
     printf("\nCould not open transmissions.txt\n"); 
     return 1; 
    } 

    // Structure definitions ############################################ 
    typedef struct transmissions { 
     char tsn; 
     char rsn; 
     int sTime; 
    } transmission; 

    // Constructing the transissions matrix ############################ 
    transmission tTms = {' ', ' ', 0}; 
    transmission tmsMtx[N][2*N]; 
    int s,t; 
    for(s =0; s < N; s++){ 
     for(t =0; t < 2*N; t++){ 
      tmsMtx[s][t] = tTms; 
     } 
    } 

    while(!feof(transmissionsFile)){ 
     int ret = fscanf(transmissionsFile, "%c %c %d", &tTms.tsn, &tTms.rsn, &tTms.sTime); 
     if(ret != 3) continue; 

     for(s = 0; s < N; ++s){ 
      if(tmsMtx[s][tTms.sTime].tsn == ' '){ 
       tmsMtx[s][tTms.sTime] = tTms; 
       break; 
      } 
      continue; 
     }  
    } 

    // Print out the transmission matrix ################################ 
    system("cls"); 
    printf ("\n The transmission matrix \n\n "); 
    for(t =0; t < 2*N; t++){ 
      printf(" T%d\t", t); 
    } 
    printf("\n\n"); 
    for(s =0; s < N; s++){ 
     printf(" "); 
     for(t =0; t < 2*N; t++){ 
      printf("%c-%c\t", tmsMtx[s][t].tsn, tmsMtx[s][t].rsn); 
     } 
     printf("\n\n"); 
    } 

    // Closing files and ending program ################################  
    fclose(transmissionsFile); 

    return 0; 
} 
+4

1) 'はfeof()'は常に間違っhttp://stackoverflow.com/q/5431941/9059022である)あなたのプログラムが消費しない各行の終わりには「\ n」があります。 – wildplasser

+2

''%c%c%d "' - % "%c%c%d" – chux

+1

ありがとう、このクイックトリックが動作します:)私は何かが行の最後に間違っていたと思った、 – alios

答えて

5

@chuxと@wildplasserのように言えます。 @wildplasser同様

int ret = fscanf(transmissionsFile, "%c %c %d\n", &tTms.tsn, &tTms.rsn, &tTms.sTime); 
if (ret != 3) { 
fprintf(stderr, "something wrong !!!\n"); 
continue; 
}; 

言う:あなたはscanfの持つ新しい行を解析していないからです。 Why is “while (!feof (file))” always wrong?のようなfeof()は使用しないでください。

int ret; 
while ((ret = fscanf(transmissionsFile, "%c %c %d\n", &tTms.tsn, &tTms.rsn, 
        &tTms.sTime)) == 3) { 
    // Do what you want 
} 
if (ret != EOF || ferror(transmissionsFile)) { 
    fprintf(stderr, "something wrong !!!\n"); 
}; 
+0

なぜ 'errno'ですか? "あなたが望むことをやる"は 'strtol()'やファイルI/Oとは関係のない 'errno'を設定する他の関数であった可能性があります。さらに、 'ret'は' EOF'と等しく、エラーがあります。 Cで指定されたI/O関数のほとんどが 'errno'をセットしていません。 – chux

+0

@chux実際に私は[man of scanf](https://linux.die.net/)の例は見当たりませんでした。 man/3/scanf) 'scanf'を呼び出す前に' errno = 0; 'を実行してください – Stargateur

+1

私はC言語で多くの練習をしていませんが、改善しています。リンク、ガイダンスのおかげで:) – alios

関連する問題