Ich habe diese Funktion, die das gesamte Array ia in eine Datei ‚Dateinamen‘ in einem JSON Textdatei Array Dateiformat namens speichert:Was unterscheidet dieses gespeicherte Array von dem geladenen Array?
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;
}
Und diese Funktion, lädt ein neues Array aus der Datei mit dem Namen ‚Dateinamen‘ , das war zuvor mit intarr_save() gespeichert.
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;
}
Es scheint alles schön, aber aus irgendeinem Grunde, die Länge des geladenen Array ist nicht das gleiche wie die Länge des gespeicherten Array. Was könnte das verursachen?
EDIT: Jetzt ist meine Funktion ist wie dieser
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;
}
Aber jetzt ist die Last immer einen Null-Zeiger zurück. Was könnte das verursachen?
Lassen Sie mich raten, ist das geladene Array * ein * kleiner als das eigentliche Array? Sehen Sie sich das Format an, das Sie an 'fscanf' übergeben, und beachten Sie, dass außer Sonderzeichen für zusätzliche Leerzeichen genau übereinstimmen müssen (einschließlich des Kommas in Ihrem Format). –
'if (value == ']')' ist das selbe wie 'if (value == 93)' was ich irgendwie bezweifle was du wolltest. Also hörst du auf, Werte zu lesen, wenn ein 93 im Array ist. – immibis
Sie können auch keine anderen Dateifehler vom 'fscanf'-Aufruf erkennen, da Sie nur eine Schleife ausführen, während' fscanf' ungleich Null zurückgibt. Wenn ein Fehler auftritt, wird 'fscanf'' EOF' zurückgeben, was "-1" ist. Außerdem wird "Wert" * niemals * gleich ""] sein, das Zeichen '']' ist keine Dezimalzahl, so dass' fscanf' es niemals im '"% d "' Format liest. Abschließend ein Wort der Warnung: Verwenden Sie kein nachstehendes Leerzeichen im 'scanf'-Format, es erfordert entweder das Dateiende oder etwas Nicht-Leerzeichen, das dem Leerraum folgt. Normalerweise funktioniert es gut für Dateien, aber nicht generell. –