2017-10-29 11 views
3

文字列をtxtファイルに書き込む際に問題があります。毎回私の行が上書きされます。私はコンパイルするには
gcc -Wall -o filename filename.cを、実行するには./filename 10 Berlin cat resultat.txtを使用します。 txtファイルには、すべてのレコードを保存するには、常に1行(最後の行)しかありません。forループでテキストファイルに書き込めません

私は都市名と住民の数とのCSVファイルを持っていますので、都市名と最低限の住民をフィルタリングする必要があります。 forループの外でwrite_file()機能を使用して

..... 
void write_file(char *result[], int len) { 
    FILE *fp = fopen("resultat.txt", "w"); 
    if (fp == NULL){ 
     perror("resultat.txt"); 
     exit(1); 
    } 
    for (int i=0; i<len; i++) { 
     fprintf(fp, "%s\n", result[i]); 
    } 
    fclose(fp); 
} 

int main(int argc,char **argv) { 

    int anzahl = atoi(argv[1]); 
    char *string_array[100]; 

    char *erste_zeile; 
    erste_zeile = (char *) malloc(1000 * sizeof(char)); 

    char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR]; 
    char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR]; 
    int bewohner[MAX_LAENGE_ARR]; 

    int len = read_file("staedte.csv", staedte, laender, bewohner); 
    for (int i = 0; i < len; ++i){ 
     if (strcmp(argv[2],laender[i])==0 && anzahl < bewohner[i]){ 
      snprintf(erste_zeile, 100,"Die Stadt %s hat %d Einwohner\n",staedte[i],bewohner[i]); 

      string_array[0] = erste_zeile; 
      // counter++; 
      write_file(string_array,1); 
     } 
    } 

    free(erste_zeile); 
    return 0; 
} 

は私にnull値を与える:私がこれまで試したどのような

。誰かがコードを最適化する方法を知っている場合は、コメントまたは回答を残してください。

+0

ファイルをループの前に開いてループの後に閉じる方が良いです。 – Serge

答えて

4

FILE *fp = fopen("resultat.txt", "w");を使用するたびに、既存のファイルを削除し、書き込み用の空のファイルを作成します。あなたが探しているものはFILE *fp = fopen("resultat.txt", "a"); //a not w!です。これにより、既存のファイルが開き、コンテンツが追加されます。ファイルが存在しない場合、ファイルが作成されます。 this referenceを参照してください。

"W" - は、書き込み用に空のファイルを作成します。同じ名前のファイルがすでに存在する場合、その内容は消去され、そのファイルは新しい空のファイルとみなされます。

"a" - ファイルに追加します。操作を記述するには、ファイルの最後にデータを追加します。ファイルが存在しない場合は作成されます。

また、各レコードのファイルを開かないことについてのヒント@セルジュのアドバイス。 mainで一度だけ開いて、ファイルハンドルを使用して書き込みます。現在のコードを動作させるには、次のようにします:

void write_file(char *result[], int len) { 
    FILE *fp = fopen("resultat.txt", "a");//open for append 
    if (fp == NULL){ 
     perror("resultat.txt"); 
     exit(1); 
    } 
    for (int i=0; i < len; i++) { 
     fprintf(fp, "%s\n", result[i]); 
    } 
    fclose(fp); 
} 
+0

ありがとう、あなたの説明は私の多くを助けた! – Marla

関連する問題