2016-06-04 16 views
0

Ich arbeite mit 4 Dateien und möchte eine Zeichenfolge an einem bestimmten Offset zu jedem von ihnen injizieren.Ich verwende fseek(), aber die Daten werden bis zum Ende geschrieben von Dateien anstelle der beabsichtigten offsets.Why, und wie kann ich es beheben:Daten werden an das Ende der Datei anstelle der angegebenen Offsets angehängt

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#define SZ 14 
#define TARGET_NUM 4 

long GetFileSize(FILE *fp); 

int main(void) 
{ 
    long offset[TARGET_NUM] = { 10,15,20,25 }; 

    const char *file_names[TARGET_NUM] = { 
              "file1.txt", "file2.txt", 
              "file3.txt", "file4.txt", 
             }; 


    char dat[TARGET_NUM][SZ + 1] = { 
             { '1','0','0','0','0','0','0','0', '0','0','0','0','0','0', 0 }, 
             { '0','1','0','0','0','0','0','0', '0','0','0','0','0','0', 0 }, 
             { '0','0','1','0','0','0','0','0', '0','0','0','0','0','0', 0 }, 
             { '0','0','0','1','0','0','0','0', '0','0','0','0','0','0', 0 }, 
            }; 

    FILE *fp[TARGET_NUM]; 

    long f_size; 
    for (size_t n = 0; n < TARGET_NUM; n++) { 
     fp[n] = fopen(file_names[n], "a"); 
     if (!fp[n]) { 
      fprintf(stderr, "Error, file %s failed to open.\n", file_names[n]); 
      goto cleanup; 
     } 
     f_size = GetFileSize(fp[n]); 
     if (offset[n] < f_size) { 
      fseek(fp[n], offset[n], SEEK_SET); 
      fprintf(fp[n], "%s", dat[n]); 
     } 
    } 

cleanup: 
    for (size_t n = 0; n < TARGET_NUM; n++) { 
     if (fp[n]) { 
      fclose(fp[n]); 
     } 
    } 
    return 0; 
} 

long GetFileSize(FILE *fp) 
{ 
    fseek(fp, 0L, SEEK_END); 
    long sz = ftell(fp); 
    fseek(fp, 0L, SEEK_SET); 
    return sz; 
} 
+0

Modus "*' "a" '*" steht für *** a *** ppend. – alk

Antwort

1

Die "a" Modus bedeutet, dass die Daten geschrieben werden, um End-of-Datei.

Versuchen Sie stattdessen "r+" Modus (lesen + schreiben).

Zitat von N1570 7.21.5.3 Die fopen Funktion:

6 eine Datei mit Zufügen-Modus öffnen (‚a‘ als erstes Zeichen im Modus Argumente) alle nachfolgenden Schreiben in die Datei verursacht werden erzwungen, zu dem dann aktuellen Dateiende, unabhängig von dazwischenliegenden Aufrufen der fseek-Funktion.

Dies bedeutet, dass Dateizeiger mit "a" Modus geöffnet wird mit fseek Operationen ausgeführt ignorieren.