Добавление данных в файл json в C: добавление останавливается после достижения определенного количества записей

Цель состоит в том, чтобы добавить записи вjson файл. Вот демонстрационная программа, похожая на мое приложение. Когда я запускаю приведенный ниже код, после добавления 1020 записей добавление останавливается.

#include <stdio.h>
#include <string.h>
#define ENTRIES_PER_LOG 10000

static int packet_count = 0;
static char filename[100] = "output.json";

int write_json(const char *json){
    packet_count++;
    // create file if it doesn't exist
    FILE* fp = fopen(filename, "r");
    if (!fp)
    {
       fp = fopen(filename, "w");
       if (!fp)
           return 0;
       fputs("[]", fp);
       fclose(fp);
    }

    // add the document to the file
    fp = fopen(filename, "rb+");
    if (fp)
    {
       // check if first is [
       fseek(fp, 0, SEEK_SET);
       if (getc(fp) != '[')
       {
           fclose(fp);
          return 0;
       }

       // is array empty?
       int is_empty = 0;
       if (getc(fp) == ']')
           is_empty = 1;

      // check if last is ]
       fseek(fp, -1, SEEK_END);
       if (getc(fp) != ']')
       {
           fclose(fp);
           return 0;
       }


       // replace ] by ,
       fseek(fp, -1, SEEK_END);
       if (!is_empty)
           fputc(',', fp);

       // append the document
       fputs(json, fp);

       // close the array
       fputc(']', fp);
       fclose(fp);
       return 1;
   }
   return 0;
}

int main(){
    int i;
    for(i = 0; i < 10000; i++){
        char json[100] = "";
        sprintf(json, "{\"a\":%d}", packet_count);
        printf("%s\n", json);
        write_json(json);
    }
}

При каждом запуске он останавливается после добавления 1020 записей вjson файл. Но программа работает до конца цикла for. При перезапуске процесса начинается добавление в файл, но снова он добавляет только 1020 записей, а затем прекращает добавление. Я не знаю, почему он останавливается. Любая помощь или указания о том, почему добавление останавливается после определенного количества записей, будут благодарны.

#
Источник
  • 0
    Открывать / закрывать файл для каждой записи - не очень хорошая идея. Кроме этого, используйте отладчик, чтобы увидеть, что он делает в итерациях, которые он ничего не пишет.
  • 0
    Что заставляет вас утверждать, что он останавливается после 1020 записей?
  • 0
    Я использовал онлайн-компилятор, и он остановился после 124 записей.
Codelisting
за 3 против
Лучший ответ

У вашей программы утечка ресурсов. Это каждый призыв кwrite_json открывает файл дважды, теряя дескриптор при первом открытии. После определенного количества обращений он достигает предела разрешенных открытых файлов.

 // create file if it doesn't exist
    FILE* fp = fopen(filename, "r"); // <------ 1st open
    if (!fp)
    {
       fp = fopen(filename, "w");
       if (!fp)
           return 0;
       fputs("[]", fp);
       fclose(fp);
    }

    // add the document to the file
    fp = fopen(filename, "rb+");   // <------ Second open overwriting `fp`
Codelisting
Популярные категории
На заметку программисту