2016-04-21 13 views
0

So habe ich eine große Textdatei mit Daten darin und ich möchte es neu anordnen. Die Daten haben eine Kombination aus ganzen Zahlen und Gleitkommazahlen pro Zeile, aber ich bin nur daran interessiert, die erste ganze Zahl, die entweder eine 1 oder 0 ist, zu packen und am Ende der Zeile zu setzen.Lesen von Daten aus Dateien in C

Zum Beispiel in meiner Datendatei, habe ich die folgende Zeile
1 0.41 1 44
und ich möchte
0.41 1 44 1

sein Das ist, was ich bisher haben und kann sie nicht arbeiten Recht. Vielen Dank.

void main() { 
FILE *fp; 
FILE *out; 

char str[15]; 
char temp; 

fp = fopen("dust.txt", "r+"); 
out = fopen("dust.dat", "w"); 

while(fgets(str, sizeof(str), fp) != NULL) { 
    temp = str[0]; 
    str[strlen(str)] = ' '; 
    str[strlen(str)+1] = temp; 
    str[strlen(str)+2] = '\r'; 
    str[strlen(str)+3] = '\n'; 

fwrite(str, 1, strlen(str), out); 
} 

fclose(fp); 
    fclose(out); 
} 
+1

auch Sie könnten Check Größe des str zurück von fgets wollen, da Sie versuchen, Länge zugreifen + 3 – ponayz

+0

Sie das 'newline' beibehalten durch' fgets' nicht übersehen. –

Antwort

4

Dies behandelt die Ausgabe als eine Textdatei (gleich wie Eingabe), keine binäre. Ich habe Code-Kommentare eingefügt, wo es angebracht ist. Ihr schwerwiegendster Fehler war der Aufruf strlen nach dem Überschreiben des Zeichenfolge-Abschlusswiderstands. Es muss nur einmal aufgerufen werden.

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

int main(void) {       // main must be type int 
    FILE *fp; 
    FILE *out; 
    char str[100];       // be generous 
    size_t len; 

    fp = fopen("dust.txt", "r"); 
    out = fopen("dust2.txt", "w");   // text file 
    if(fp == NULL || out == NULL) 
     return 1; 

    while(fgets(str, sizeof(str)-3, fp) != NULL) { 
     str [ strcspn(str, "\r\n") ] = 0; // remove trailing newline etc 
     len = strlen(str); 
     str[len] = ' ';      // overwrites terminator 
     str[len+1] = str[0];    // move digit from front 
     str[len+2] = 0;      // terminate string 
     fprintf(out, "%s\n", str + 2);  // write as text 
    } 

    fclose(fp); 
    fclose(out); 
    return 0; 
} 

Eingabedatei:

1 0.41 1 44 
0 1.23 2 555 

Ausgabedatei:

0.41 1 44 1 
1.23 2 555 0 
+0

Wenn das stimmt, sollte die OP warum 1.23 2 555 0 erklären und nicht 0 1,23 2 555. Ich verstehe, dass die OP der Schwimmer zuerst und dann der Rest braucht, ist aber nicht ganz klar, ob es so – Michi

+1

@Michi ist, warum sollte er ? Er hat gesagt, was er will, wir wissen nicht warum, es ist unwichtig. –

+0

Sie haben recht, leider war ich nicht die Aufmerksamkeit auf die Frage zu bezahlen :) – Michi

1

über diese 2 Zeilen Denken

str[strlen(str)] = ' '; 
str[strlen(str)+1] = temp; 

Die ersten Sätze der Null-Zeichen zu ' '. Die 2. Aufrufe strlen(str), noch str haben kein bestimmtes Nullzeichen mehr, was zu undefiniertem Verhalten (UB) führt.


vorschlagen statt

str[strcspn(str, "\r\n")] = '\0'; // lop off potential end-of-line characters. 
int prefix; 
int n; 
if (sscanf(str, "%d %n", &prefix, &n) != 1) Handle_Missing_Lead_int(); 
fprintf(out, "%s %d\n", &str[n], prefix); 

eine Datei im Textmodus öffnen und dann "\r\n" ist auch ein Problem, da das Schreiben von Code könnte die "\r" schreiben und dann die "\n" nehmen und übersetzen als in "\r\n" resultierende in "\r\r\n". Schlagen Sie entweder vor, die Datei im Textmodus zu öffnen und schreiben Sie eine einzelne "\n" (die bei Bedarf übersetzt wird) oder öffnen Sie die Datei im Binärmodus und schreiben Sie explizit "\r\n".


BTW: Betrachten großzügiger als 15 in char str[15]; zu sein. Vielleicht 100?