Forum: Mikrocontroller und Digitale Elektronik Detein in C programmiersprache


von Dan (Gast)


Lesenswert?

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

von r3tr0 (Gast)


Lesenswert?

Ich moec = 8 Zeichen, sollte dir das nicht auf die Sprünge helfen? :)

von Oliver S. (oliverso)


Lesenswert?

Dan schrieb:
> Ausgabe aber


Glaube ich nicht, der gezeigte Code wird so nicht mal kompilieren bzw. 
linken.

Oliver

von Dan (Gast)


Angehängte Dateien:

Lesenswert?

bei 20 kommt das raus

von Dan (Gast)


Lesenswert?

ich möchte einfach die Datein vollständig lesen und weiter bearbeiten , 
aber hat noch nicht geklappt , ich bin anfänger in C

von Mikro 7. (mikro77)


Lesenswert?

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.

von lalala (Gast)


Lesenswert?

und hier

unsigned char data[BLOCK_SIZE];

mal lieber BLOCK_SIZE+1 schreiben.

von Dan (Gast)


Lesenswert?

Mikro 77

>  fseek( file, pos, SEEK_SET );
 Das benuze ich , damit ich in einem anderen datein schreiben kann

von tux (Gast)


Lesenswert?

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...

von S.Siebenhaar (Gast)


Lesenswert?

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;-)

von Dan (Gast)


Lesenswert?

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

von tux (Gast)


Lesenswert?

S.Siebenhaar schrieb:
> Mit welchem Compiler arbeitest Du eigentlich?

wahrscheinlich mit einer C-KI ;-)

von Mikro 7. (mikro77)


Lesenswert?

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(...)

von Dan (Gast)


Lesenswert?

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

von S.Siebenhaar (Gast)


Lesenswert?

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?

von Bewunderer (Gast)


Lesenswert?

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.

von Dan (Gast)


Lesenswert?

Mikro 77

ich will das alles als Blocken lesen ,dann bearbeiten, dann wieder 
schreiben - und nicht das ganze datein auf einmal lesen .

Dan

von Mikro 7. (mikro77)


Lesenswert?

Dann präsentiere bitte ein vollständiges kompilierbares Programm. Nutze 
die C-Code Tags für den Quelltext oder mach' einen Anhang.

von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

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).

von Dan (Gast)


Lesenswert?

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

von Mikro 7. (mikro77)


Lesenswert?

Daniel A. schrieb:
> ...

Ist es gewollt, dass die Datei mit Nullen aufgefüllt wird, wenn die 
Dateigröße kein Vielfaches von BLOCK_SIZE ist?

von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

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.

von Marco H. (damarco)


Lesenswert?

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.

von Dan (Gast)


Angehängte Dateien:

Lesenswert?

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

von Dan (Gast)


Lesenswert?

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

von PittyJ (Gast)


Lesenswert?

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.

von Marco H. (damarco)


Lesenswert?

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 ?

von Mikro 7. (mikro77)


Lesenswert?

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).

von Marco H. (damarco)


Lesenswert?

1
fread( data, 1, BLOCK_SIZE, file );
 nicht ?
1
size_t fread(void *puffer, size_t blockgroesse,
2
             size_t blockzahl, FILE *datei);

von Mikro 7. (mikro77)


Lesenswert?

Was möchtest du mit deinen Zitat sagen (fragen)?

btw: Hast du das Programm einmal selbst ausprobiert?

von Dan (Gast)


Lesenswert?

ich hab das programm im Codeblock probiert . und kommt raus , was ich 
geschrieben habe !!!

von Dan (Gast)


Lesenswert?

ich habe mehrmals wiederholt und nach Fehlern gesucht , doch scheint 
dass das Programm fehlerfrei ist

von Jimmy (Gast)


Lesenswert?

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 :-)

von Dan (Gast)


Lesenswert?

>> Na dann ist doch alles in Butter :-)

was meinst du ?

von Mikro 7. (mikro77)


Lesenswert?

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.)

von Dan (Gast)


Lesenswert?

>> Mikro 77
>>Probier mal "wb" statt "w"

ja hat geklappt das war der Fehler .

danke für die links , sie werden mir viel helfen

von Mikro 7. (mikro77)


Lesenswert?

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
Noch kein Account? Hier anmelden.