Leute, ich kann nicht mehr und brauche Vieraugenprinzip #include <stdlib.h> #include <stdint.h> #include <string.h> #define BLOCK_SIZE 8 #include <stdio.h> #include <stdbool.h> #define FOPEN_READ "r" #define FOPEN_WRITE "w" #define FOPEN_BINARY "b" void FileCrypt(const char* filename) { FILE* file = fopen(filename, FOPEN_READ FOPEN_WRITE FOPEN_BINARY ); if(!file){ printf("Could not open file"); return; } fseek(file, 0, SEEK_END); // seek to end of file size_t size = ftell(file); // get current file pointer fseek(file, 0, SEEK_SET); int n_blocks=size/BLOCK_SIZE; if(size%BLOCK_SIZE!=0) ++n_blocks; printf("%d ", n_blocks); size_t i; unsigned pos; for( i=0; i<n_blocks; i++ ){ unsigned char data[BLOCK_SIZE]; pos = ftell( file ); fread( data, 1, BLOCK_SIZE, file ); //fread(data, BLOCK_SIZE, 1, file); printf("%8s ", data); fseek( file, pos, SEEK_SET ); memset(data,0,BLOCK_SIZE); } fclose( file ); } int main() { FileBearbeiten("file.txt"); } Im Datein steht: Ich moechte diese Datein bearbeiten Ich moechte diese Datein bearbeiten Ich moechte diese Datein bearbeiten Ich moechte diese Datein bearbeiten Ausgabe aber 19 ich moec ich moec ich moec ich moec ich moec ich moec ----(19 mal) Vielen dank im Voraus ich moec
Ich moec = 8 Zeichen, sollte dir das nicht auf die Sprünge helfen? :)
Dan schrieb: > Ausgabe aber Glaube ich nicht, der gezeigte Code wird so nicht mal kompilieren bzw. linken. Oliver
ich möchte einfach die Datein vollständig lesen und weiter bearbeiten , aber hat noch nicht geklappt , ich bin anfänger in C
Du liest immer nur die ersten acht Zeichen der Datei. Dan schrieb: > pos = ftell( file ); ...liefert 0. > fread( data, 1, BLOCK_SIZE, file ); ...inkrementiert den file pointer um BLOCK_SIZE. > printf("%8s ", data); > fseek( file, pos, SEEK_SET ); ...setzt den file pointer wieder auf 0 zurück.
und hier unsigned char data[BLOCK_SIZE]; mal lieber BLOCK_SIZE+1 schreiben.
Mikro 77
> fseek( file, pos, SEEK_SET );
Das benuze ich , damit ich in einem anderen datein schreiben kann
wahrscheinlich bin ich blind und die Suchfunktion meines Browsers funktioniert ebenfalls nicht... Dan schrieb: > int main() > { > FileBearbeiten("file.txt"); > > } ...wo ist denn die Prozedur FileBearbeiten() definiert? Neben einem vernünftig formatierten Quelltext, wäre dann an zweiter Stelle auch übersetzbarer Quelltext ganz hilfreich...
Mit welchem Compiler arbeitest Du eigentlich? Oder ist es möglich uns den tatsächlichen Code zu zeigen? Bei mir geht ein Aufruf: >>> FileBearbeiten("file.txt"); nicht, wenn nur: >>> void FileCrypt(const char* filename) definiert ist. Vielleicht ist mein Compiler aber auch nur zu penibel;-)
lesen fread( data, 1, BLOCK_SIZE, file ); //fread(data, BLOCK_SIZE, 1, file); printf("%s ", data); bearbeiten... im gleichen Datein wieder schreiben fseek( file, pos, SEEK_SET ); fwrite( data, 1, BLOCK_SIZE, file ); memset(data,0,BLOCK_SIZE); Dan
S.Siebenhaar schrieb: > Mit welchem Compiler arbeitest Du eigentlich? wahrscheinlich mit einer C-KI ;-)
Dan schrieb: > Mikro 77 > >> fseek( file, pos, SEEK_SET ); > Das benuze ich , damit ich in einem anderen datein schreiben kann Das benutzt du um in eine andere Datei zu schreiben? Das ist... interessant. Eigentlich ändert fseek() den file pointer einer geöffneten Datei. Pseudo Code für's Lesen aus einer Datei:
1 | n = fread(...) |
2 | while (n != 0) |
3 | if (n < 0) |
4 | deal with the error ; |
5 | process data ; |
6 | n = fread(...) |
tux sorry die funktion heißt FileBearbeiten auch bei mir im programm , ich hab das hier falsch geschrieben . im Codeblock ist aber richtig . sonst läuft nicht mein Programm
Kann es sein, dass wir es hier mal wieder mit einem typischen Fall von: "Ich habe keine Ahnung, aber ich kann kopieren" zu tun haben?
Leute, versteht ihr, vovon Dan faselt? Ich habe hier alle Kollegen gefragt, was Deteins und Dateins sind. Keiner hat jemals davon gehört. Ich komme mir so dumm vor im Vergleich zu Dan, der sich mit all dem auskennt.
Mikro 77 ich will das alles als Blocken lesen ,dann bearbeiten, dann wieder schreiben - und nicht das ganze datein auf einmal lesen . Dan
Dann präsentiere bitte ein vollständiges kompilierbares Programm. Nutze die C-Code Tags für den Quelltext oder mach' einen Anhang.
Das gehört noch zu dem Thread, oder: Beitrag "Re: von C++ nach C" Dort sind mir 2 kleinere Fehler unterlaufen, es sollte /fopen(filename, "r+b" );/ statt /fopen(filename, "rwb" );/ sein, keine Ahnung warum, die Optionen haben mir noch nie eingeleuchtet. Und statt /fwrite( data, 1, BLOCK_SIZE, size );/ sollte es /fwrite( data, 1, BLOCK_SIZE, file );/ sein. Im Anhang noch ein Beispiel. Um noch zu erklären, warum du diese Ausgabe bekommst: Der interne Filepointer ist der Offset in der Datei, von wo man gerade liest oder wohin man schreibt. ftell fragt den Offset ab, und fseek setzt ihn. Bei fwrite und fread wird er verschoben. Du speicherst erst den Offset (fread), liest 8 bytes ein (fread), und setzt den Offset zurück (fseek). Dann wiederholst du das ganze. Wenn nach dem Zurücksetzen wieder 8 bytes geschrieben würden, wie in der Alten variante, wobei das nur passiert wenn die Datei auch schreibend geöffnet wird, was bei "rwb" bei mir nicht der fall war, bist du nachher wieder dort wo du nach fread warst (ungefähr).
Vielen Dank zu euch allen ich habe paar Ideen gesammelt und bemühe ich mich erstmal das allein zu schaffen. wenn es nicht klappt dann schreibe ich wieder Vielen dank nochmal Dan
Daniel A. schrieb: > ... Ist es gewollt, dass die Datei mit Nullen aufgefüllt wird, wenn die Dateigröße kein Vielfaches von BLOCK_SIZE ist?
Noch so nebenbei, der code ist relativ fehleranfällig, funktioniert nur bei files, etc. Im Anhang biete ich noch ein Beispiel wie man ohne fseek Daten von stdin bearbeiten, und auf stdout ausgeben kann, stdin und stdout kann man ja bei so ziemlich jedem OS beliebig umleiten, und dann kann man das Programm auchnoch mit anderen verknüpfen. Mikro 7. schrieb: > Daniel A. schrieb: >> ... > > Ist es gewollt, dass die Datei mit Nullen aufgefüllt wird, wenn die > Dateigröße kein Vielfaches von BLOCK_SIZE ist? So war das zumindest bei der C++ Version vom ursprünglichen thread: Beitrag "von C++ nach C" Ich hab's nur übersetzt, ob es gewollt ist weiss ich nicht.
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_017.htm#mjd6205d099779f805fd974466f81d3e86 Das ganze Thema hier durcharbeiten und das gelernte umsetzen. Dann klappt es bestimmt ;) Auch das Thema NULL Zeiger bitte gleich mit abarbeiten.
kan nicht mehr _ file: Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abteilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abteilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abteilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abteilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/7 beim Auruf von : FileBA1("file.txt","file1.txt") kommt raus n_blocks = 82 file1 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abteilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abteilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abteilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abteilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/7 und beim Auruf von : FileBA2("file1.txt","file2.txt") kommt raus n_blocks=86 und file2 : Abteilung23/Raum/Nummer/2 Abtilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abtilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abtilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abtilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abtilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abtilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abtilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abtilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abtilung23/Raum/Nummer/7 Abteilung23/Raum/Nummer/2 Abtilung23/Raum/Nummer/2 Abteilung23/Raum/Nummer/5 Abtilung23/Raum/Nummer/6 Abteilung23/Raum/Nummer/7 Abtilung23/Raum/Nummer/7 Warum wird gesprungen? , (Übrigens: das muss so blockweise bearbeitet werden) vielen dank im voraus
Es soll einfach vom file gelesen und in file1 geschrieben werden dann vom file1 gelesen und in file2 geschrieben werden aber kommt nicht das gleiche
In meinem ersten C-Buch (Kernighan/Ritchie) von vor 30 Jahren gab es schon Beispiele, wie man Dateien liest und schreibt. Vielleicht sollte man doch mal auf die Klassiker zurückgreifen, lesen, und mit dem Wissen noch einmal mit dem Programm anfangen. Das hat früher auch funktioniert, und es war damals nicht alles schlecht. Früher hat man auch printf() in den Programmcode eingebaut, um z.B. zu sehen, was pos von ftell für einen Wert bekommt. Das geht heute anscheinend auch nicht mehr.
Das Problem ist das er den Lesezeiger ans Ende setzt um die Größe zu ermitteln dann das durch 8 teilt und auch noch falsch versucht Blockweise auszugeben. Nicht nur das, auch noch völlig ignoriert wie ein String gespeichert wird und welche Funktionen damit sinnvoll umgehen können. Stichwort \0 \n ;) Steht doch alles in dem Link. Arbeite das doch einmal durch ! Was erwartest du ? Das dir jemand die Lösung serviert ?
Dan schrieb: > Es soll einfach vom file gelesen und in file1 geschrieben werden > dann vom file1 gelesen und in file2 geschrieben werden > > aber kommt nicht das gleiche Dann benutzt du wohl was anderes als das oben angehangene Programm. Bei mir kopiert das die Dateien 1:1 (und füllt auf ein Vielfaches von acht auf).* Marco H. schrieb: > Das Problem ist das er den Lesezeiger ans Ende setzt um die Größe > zu > ermitteln dann das durch 8 teilt und auch noch falsch versucht > Blockweise auszugeben. Nö. Die Implementierung ist zwar alles andere als "optimal", aber wirklich falsch ist da nichts. Kann ich zumindest nicht sehen. > Nicht nur das, auch noch völlig ignoriert wie ein String gespeichert > wird und welche Funktionen damit sinnvoll umgehen können. Stichwort \0 > \n ;) Nö. Ist doch völlig egal wie/wer/was/wo ein "String" ist. Das Programm kopiert einfach Bytes (Characters). > Steht doch alles in dem Link. Arbeite das doch einmal durch ! So ein bisschen mit C und der Bibliothek beschäftigen wäre in der Tat nicht schlecht. *Edit: Zumindest unter Linux (Ubuntu gcc 4.8.4).
1 | fread( data, 1, BLOCK_SIZE, file ); |
nicht ?
1 | size_t fread(void *puffer, size_t blockgroesse, |
2 | size_t blockzahl, FILE *datei); |
Was möchtest du mit deinen Zitat sagen (fragen)? btw: Hast du das Programm einmal selbst ausprobiert?
ich hab das programm im Codeblock probiert . und kommt raus , was ich geschrieben habe !!!
ich habe mehrmals wiederholt und nach Fehlern gesucht , doch scheint dass das Programm fehlerfrei ist
Dan schrieb: > ich hab das programm im Codeblock probiert . und kommt raus , was > ich geschrieben habe !!! Dan schrieb: > ich habe mehrmals wiederholt und nach Fehlern gesucht , doch > scheint dass das Programm fehlerfrei ist Na dann ist doch alles in Butter :-)
Dan schrieb: > ich hab das programm im Codeblock probiert . und kommt raus , was ich > geschrieben habe !!! Da es unter Linux funzt (mit "\n" und "\r\n" als Zeilenende) nehme ich an du arbeitest unter Windows!? Probier mal "wb" statt "w" beim fopen() deiner zu schreibenden Dateien. Hier etwas zum Lesen: https://msdn.microsoft.com/en-us/library/yeby3zcb.aspx https://msdn.microsoft.com/en-us/library/h9t88zwz.aspx "If stream is opened in text mode, each linefeed is replaced with a carriage-return – linefeed pair." Unter Linux dagegen (fopen(3c)): The mode string can also include the letter 'b' either as a last char‐ acter or as a character between the characters in any of the two-char‐ acter strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming sys‐ tems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.)
>> Mikro 77 >>Probier mal "wb" statt "w" ja hat geklappt das war der Fehler . danke für die links , sie werden mir viel helfen
Schön, dass es funktioniert... ...dann hätte ich noch ein paar Fragen an dich. * Was unterscheidet die Funktion FileBA1() von der Funktion FileBA2()? * Was passiert, wenn die Eingabedatei weniger als 8 Zeichen lang ist? * Was passiert wenn die Länge der Eingabedatei kein Vielfaches von 8 ist? * Was genau bewirkt ftell() und fseek() in der Schleife? * Wann darf man die Rückgabewerte von Funktionen ignorieren? * Wieso muss die Länge der Datei ermittelt werden? * Wieso ist die Blockgröße 8? * Was passiert wenn data[BLOCKSIZE] statt data[BLOCK_SIZE+1] definiert wird? * Warum ist data[] als unsigned char definiert? * Welchen Wert gibt main() zurück? Have fun! ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.