Problem mit Datei
-
Hi Leute!
Ich hab ein ernstes Problem: Ich habe eine volle .txt Datei und möchte die letzte Zeile als Header vor die erste bringen.Ich habs schon mit
fseek(sWrite, 0L, SEEK_SET);
for(iC1 = 0; iC1 <= iCount; iC1++)
{
for(iC2 = 0; iC2 <= strlen(acArray3[iC1]); iC2++)
fprintf(sWrite, "%c", acArray3[iC1][iC2]);
}probiert, aber dann überschreibt er mir die erste Zeile!!
/edit: acArray3 is ein 2-dim Array, welches ich Zeile für Zeile in die Datei schreibe!
Habt ihr vll. ne Lösung für mein Problem parat?
lg, Arci
[ edit by c.rackwitz: posts zusammengefuehrt ]
-
ganz in den speicher lesen, im speicher manipulieren, alles wieder zurueckschreiben.
"textdatei" heisst "ein haufen zeichen, welche zufaellig ein text sein koennten", aber keinesfalls "ein haufen zeilen". das konzept der "zeile" hat nichts mit dateien zu tun.
fopen() mit "b" oeffnet binaer, ohne "b" oder mit "t" oeffnet als text.
unterschied: textdateien bekommen eine umwandlung von zeilenumbruchzeichen beim lesen und scheiben, binaerdateien werden 1:1 gelesen und geschrieben.
-
c.rackwitz schrieb:
ganz in den speicher lesen, im speicher manipulieren, alles wieder zurueckschreiben.
Und wie genau mach ich das?
-
mit fgets immer eine zeile lesen. mit fputs immer eine zeile schreiben.
das irgendwo in den speicher packen, vorzugsweise mittels realloc() und einer beliebig gearteten variante eines 2-dimensionalen dynamischen arrays.ein wenig ueber die arrayvarianten, die dir nuetzlich sein koennten:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-933701.html#933701
http://www.c-plusplus.net/forum/viewtopic-var-p-is-989590.html#989590
-
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LENGTH 1000 int main() { FILE *sRead; FILE *sWrite; char acArray1[LENGTH]; char acArray2[LENGTH]; char acArray3[LENGTH][LENGTH]; char acDumb[LENGTH]; int iCount = 0; int iCheck = 0; int iC1 = 0; int iC2 = 0; printf("Please enter the path of the cluster file: "); gets(acDumb); fflush(stdin); sRead = fopen(acDumb, "r"); printf("Please enter the path for the new file: "); gets(acDumb); fflush(stdin); sWrite = fopen(acDumb, "w"); fscanf(sRead, "%s", &acDumb); while(strcmp(acDumb, "-----------------------------------")) fscanf(sRead, "%s", &acDumb); fgetc(sRead); char cChar = fgetc(sRead); while(cChar != '[') { acArray1[0] = cChar; if(acArray1[0] == ' ' || acArray1[0] == '-') { fgets(acDumb, 100, sRead); if(acArray1[0] == '-') fprintf(sWrite, "\n"); } else { while(acArray1[iC1] != ':') { iC1++; acArray1[iC1] = fgetc(sRead); } iCheck = strcspn(acArray1, ":"); acArray1[iCheck+1] = '\0'; iCheck = 0; for(iC1 = 0; iC1 <= iCount; iC1++) { if(strcmp(acArray1, acArray3[iC1]) == 0) { iCheck = 1; break; } } if(!iCheck) { strcpy(acArray3[iCount], acArray1); iCount++; } iC1 = 0; iC2 = 0; if(fgetc(sRead) == ' ') { cChar = fgetc(sRead); while(cChar == ' ') cChar = fgetc(sRead); fputc(cChar, sWrite); fgets(acArray2, 1000, sRead); iCheck = strcspn(acArray2, "\n"); acArray2[iCheck] = ';'; acArray2[iCheck+1] = '\0'; fputs(acArray2, sWrite); } } cChar = fgetc(sRead); } fseek(sWrite, 0L, SEEK_SET); for(iC1 = 0; iC1 <= iCount; iC1++) { for(iC2 = 0; iC2 <= strlen(acArray3[iC1]); iC2++) fprintf(sWrite, "%c", acArray3[iC1][iC2]); acArray3[iC1][iC2] = ';'; acArray3[iC1][iC2+1] = '\0'; fprintf(sWrite, "%c", acArray3[iC1][iC2]); } fprintf(sWrite, "\n"); fclose(sRead); fclose(sWrite); printf("\n---FINISHED---\n\n"); system("pause"); return 0; }
Das is das ganze Programm falls es hilft :p
Ich hab eine .txt File parsen müssen...
[ edit by c.rackwitz: cpp-Tags hinzugefuegt ]
-
c.rackwitz schrieb:
mit fgets immer eine zeile lesen. mit fputs immer eine zeile schreiben.
das irgendwo in den speicher packen, vorzugsweise mittels realloc() und einer beliebig gearteten variante eines 2-dimensionalen dynamischen arrays.ein wenig ueber die arrayvarianten, die dir nuetzlich sein koennten:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-933701.html#933701
http://www.c-plusplus.net/forum/viewtopic-var-p-is-989590.html#989590danke, werds versuchen
-
Gibts da keinen Befehl das er die Zeile nicht überschreiben soll?
-
c.rackwitz schrieb:
ganz in den speicher lesen, im speicher manipulieren, alles wieder zurueckschreiben.
...ist aber nur bei kleinen dateien empfehlenswert
Arci schrieb:
Gibts da keinen Befehl das er die Zeile nicht überschreiben soll?
erzeug doch einen neue datei und schreib' alles da rein, dann wird nix überschrieben. ...also nicht mit fseek in eine bestehende datei hineingehen und dann schreiben. damit wird immer das überschrieben was vorher da drin war.
-
Arci schrieb:
Gibts da keinen Befehl das er die Zeile nicht überschreiben soll?
Nein! Und das hat nichts mit C, C++, Java, Prolog, Fortran, ...; kurz mit irgendeiner Programmiersprache zu tun.
Die heute gängigen Betriebssysteme bieten eben nur sequentielle Dateien an.
Da kannst du nicht einfach irgendwo ein Zeichen einfügen; geschweige denn
eine ganze Zeile.