gpt4 book ai didi

c - 这个保存的数组与加载的数组有什么不同?

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:54 24 4
gpt4 key购买 nike

我有这个函数,它以 JSON 文本文件数组文件格式将整个数组 ia 保存到一个名为“filename”的文件中:

int intarr_save_json( intarr_t* ia, const char* filename )
{
if(ia==NULL)
{
return 1;
}
int *arr=ia->data;
int n=ia->len;
int i;
FILE *p;
p=fopen(filename,"w");
if(p!=NULL)
{
fprintf(p,"[\n");
for(i=0;i<n;i++)
{
if(i!=n-1)
{
fprintf(p," %d,\n",arr[i]);
}
else
{
fprintf(p," %d\n",arr[i]);
}
}
fprintf(p,"]");
fclose(p);
return 0;
}
return 1;
}

这个函数从名为“文件名”的文件中加载一个新数组,那是 之前使用 intarr_save() 保存。

intarr_t* intarr_load_json( const char* filename )
{
FILE* f = fopen(filename, "r");
if (f == NULL) return NULL;

intarr_t* loaded = intarr_create(0);

int value;
//Get rid of [
fscanf(f, "%c ", &value);

while (fscanf(f, "%d, ", &value)) {
if (value == ']') break;
intarr_push(loaded, value);
}


fclose(f);
return loaded;
}

这一切看起来不错,但是,由于某种原因,加载数组的长度与保存数组的长度不同。可能是什么原因造成的?

编辑:现在我的功能是这样的

int intarr_save_json( intarr_t* ia, const char* filename )
{
if(ia == NULL)
{
return 1;
}
int *arr=ia->data;
int n=ia->len;
int i;
FILE *p;
p=fopen(filename,"w");
if(p!=NULL)
{
fprintf(p,"[\n");
for(i=0;i<n;i++)
{
if(i!=n-1)
{
fprintf(p," %d,\n",arr[i]);
}
else
{
fprintf(p," %d\n",arr[i]);
}
}
fprintf(p,"]");
fclose(p);
return 0;
}
return 1;
}

and
intarr_t* intarr_load_json( const char* filename )
{
FILE* f = fopen(filename, "r");
if (f == NULL)
{
return NULL;
}

intarr_t* loaded = intarr_create(0);

int value;


char line[100];
while ( fgets(line, 100, f) )
{
if ( line[0] == ']' )
{
break;
}

if ( sscanf(line, "%d", &value) != 1 )
{
break;
}

// Use the number
intarr_push(loaded, value);
}

fclose(f);
return loaded;
}

但是现在加载总是返回一个空指针。可能是什么原因造成的?

最佳答案

使用的逻辑

while (fscanf(f, "%d, ", &value)) {
if (value == ']') break;

有缺陷。

文件的最后两行将是

<some number>
]

fscanf 的调用将在该行失败。因此,您最终读取的数字将比写入文件的数字少一个。

我建议稍微改变策略。

// Read the contents of the file line by line
// Process each line.
char line[100];
while ( fgets(line, 100, f) )
{
if ( line[0] == ']' )
{
break;
}

if ( sscanf(line, "%d", &value) != 1 )
{
break;
}

// Use the number
intarr_push(loaded, value);
}

关于c - 这个保存的数组与加载的数组有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38821880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com