Не удается записать в текстовый файл цикл for в c

У меня проблема с записью строк в текстовый файл. Мои строки каждый раз перезаписываются. Я использую
gcc -Wall -o filename filename.c для компиляции и ./filename 10 Berlin cat resultat.txt для выполнения. В txt файле всегда только одна строка (последняя), как мне сохранить все записи.

У меня есть CSV-файл с названиями городов и количеством жителей, мне нужно отфильтровать название города и минимальное количество жителей.

Что я пробовал до сих пор:

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

Использование функции write_file() вне цикла for дает мне null значений. Если у кого-то есть идея, как оптимизировать код, пожалуйста, оставьте комментарий или ответ.


person Marla    schedule 29.10.2017    source источник
comment
лучше открыть файл только один раз перед циклом и закрыть его после цикла.   -  person Serge    schedule 30.10.2017


Ответы (1)


Каждый раз, когда вы используете FILE *fp = fopen("resultat.txt", "w");, это удаляет существующий файл и создает пустой файл для записи. То, что вы ищете, это FILE *fp = fopen("resultat.txt", "a"); //a not w!. Это откроет существующий файл и добавит содержимое. Если файл не существует, он будет создан. См. эту ссылку.

"w" – создает пустой файл для записи. Если файл с таким именем уже существует, его содержимое стирается и файл считается новым пустым файлом.

"a" – добавляется к файлу. Операции записи, добавление данных в конец файла. Файл создается, если он не существует.

Также прислушайтесь к совету @Serge не открывать файл для каждой записи. Просто откройте его один раз в 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);
}
person Nik    schedule 29.10.2017