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.
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;-)
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:
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
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.
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
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.
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).
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.aspxhttps://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.)
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! ;-)