2017-11-06 4 views
1

こんにちは私は、Cプログラムでfgetsを使用して、名前が.csvファイルの行に存在するかどうかを確認しています。存在する場合は、配列に保存してから返します。現在、.csvファイルのすべての行が保存されており、理由はわかりません。fgetsを使用して、この行が.csvファイルに存在するかどうかを調べるにはどうすればよいですか? (C)

Cファイル:

void FindRecord(char *filename, char *name, char record[]) { 

    char *temp = record; //temp save record 

    FILE *q = fopen(filename, "r"); //check that ths inputed .csv file exists 
    if (q == NULL) { //if it doesn't, then print error message and exit 
     printf("This .csv does not exist"); 
     exit(1); //terminate with error message 
    } 

    while(!feof(q)) { //while I'm not at the end of the file 
     fgets(temp, 1000, q); //Reads a line @ a time 
     for (int i = 0; i < 1000; i++) { 
      if(temp[i] == *name) { 
       record[i] = temp[i]; 
       name++; 
      } 
     } 
     printf("%s", record); 
    } 
    fclose(q); 
} 

.csvファイル:

Kevin, 123-456-7890 
Sally, 213-435-6479 
Megan, 415-336-8790 

今私がプログラムを実行するときに起こっていただきましたが、それは3行を返すことです。今、私はプログラムが3行を返すことで実行したときに起こっていただきました!Kevin, 123-456-7890

+3

[なぜwhile(!feof(file))が常に間違っているのですか?](https://stackoverflow.com/a/26557243/1983495)をお読みください。 –

+0

なぜ 'fgets(temp、1000、q)'に1000があるのですか? 'record'はそれほど大きなものではありません。呼び出しコードを確認する必要があります。 – chux

+0

'record'と' temp'は同じメモリを指していますので、 'record [i] = temp [i]'は役に立たないです。 'fgets(temp、1000、q);'ファイルから 'temp'と' record'に何でもロードします。 – yano

答えて

2

:私は名前"Kevin"へ​​ポイントは、それが一時付属していた場合、それだけで戻りますことを、ISOが欲しいです。

私はそれがどのように可能かわかりません。結果を返す配列が1つしかありません。私はあなたのコードすべての3行を印刷すると信じることができますが、それは返す最後のです。

私は、ISOが欲しい​​名前"Kevin"を指し、それはtempが付属している場合、それだけで戻りますこと:Kevin, 123-456-7890

さて、あなたのコードは、その点でいくつかの問題があります。最も重要なの中には:

  • それはいくつかの文字単位での比較を行いますが、それが一致しない行を拒否するためにどこにもコードを持っていません。

  • tempは、recordと同じ配列を指すように設定し、その配列に各行を読み込みます。これは一致が見つからない場合でもその配列を上書きし、最後の行以外の行に一致が見つかった場合は実際の一致が失われます。

  • 部分一致の場合にリセットするメカニズムがなく、一致を試みるときにnameポインタを変更します。

  • 名前を一致させようとすると、入力行の区切り文字,を丁寧にスキャンし、その場合は名前と入力文字列の文字列ターミネータをスキャンします。

  • while (!feof(file)) is always wrong

関連する問題