Цель состоит в том, чтобы добавить записи в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 записей, а затем прекращает добавление. Я не знаю, почему он останавливается. Любая помощь или указания о том, почему добавление останавливается после определенного количества записей, будут благодарны.
У вашей программы утечка ресурсов. Это каждый призыв к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`