# [C] Datei auslesen



## AsaTru (18. Juli 2009)

Hallo zusammen. Wie die Überschrift schon sagt, möchte ich eine Datei auslesen, Zeile für Zeile.
Mir ist bewusst das dieses Problem hier schon mehrfach behandelt wurde, allerdings helfen mir all die Threads nicht weiter..

Kurz ein paar Infos: Ich arbeite mit einem Microcontroller (AT90USB1286), der einen externen Speicher (8MB) hat. Dieser kann via USB benutzt werden. 
Die eigentliche Aufgabe des Programms soll es sein, ein Bild Zeile für Zeile auszulesen und den Wert an ein Display zu geben. Für den Anfang hab ich erstmal eine Text Datei erstellt und Drei Zeilen mit verschiedenen Werten beschrieben.

Hier mein momentaner Code:

```
void main()
{
const char get[128];    

// USB is connected-> don't log
if(Is_usb_vbus_high())
{
	return;
}

FATFS fatfs;
FIL fp;
f_mount(0,&fatfs);
f_open(&fp,"hallo.txt",FA_OPEN_ALWAYS | FA_READ);

while( !feof(&fp))
{
fgets(&get,128,&fp);
}
f_close(&fp);
f_mount(0,NULL);
}
```


Das Problem ist, ich kann jede Zeile auslesen, indem ich z.B. Dreimal fgets(); eingebe, liest er mir die Dritte Zeile aus. Bei Fünfmal die fünfte Zeile usw..

Aber das Bild welches ich auslesen möchte, besteht aus mehreren Tausend Zeilen und ich bin mir sicher das es eine total einfache Lösung für dieses Problem gibt, das ich in der Schleife einfach einen Wert erhöhe und er dann in die nächste Zeile springt.

Ich benutze das AVR Studio 4.16 und lese über „Watch“ den get[] Wert aus. Ich schaffe es aber die Werte einzeln einzulesen. Es geht auch wenn ich get2[]; get3[] usw. benutze aber das ist ja nicht Sinn der Sache.

Ich arbeite noch nicht lange mit C und versuche es zu verbessern, aber bei diesem Problem stehe ich vollkommen auf dem Schlauch, wie gesagt, wahrscheinlich ist das Problem für die meisten nicht mal die Mühe wert, aber mich  treibt es an den Rand der Verzweiflung.

In einem anderen Thread wurde das ganze so gelöst:

```
FILE *f = fopen( "test.txt", "r" ) ;
while( !feof( f ) )
{
  fgets( buffer, sizeof( buffer ), f ) ;
  // hier den String verarbeiten
}
```
Trotzdem liest das Programm nur eine Zeile aus (die letzte in diesem Fall), ich möchte ungern meinen Code mit Variablen die mit 1000 enden befüllen.. 

Kann mir jemand Helfen?

mfg


----------



## Matthias Reitinger (18. Juli 2009)

AsaTru hat gesagt.:


> Kurz ein paar Infos: Ich arbeite mit einem Microcontroller (AT90USB1286), der einen externen Speicher (8MB) hat. Dieser kann via USB benutzt werden.


Wie meinst du das? Der externe Speicher ist über USB angebunden?



AsaTru hat gesagt.:


> Hier mein momentaner Code:
> 
> ```
> void main()
> ...


Wieso const? Du willst den Puffer ja verändern.



AsaTru hat gesagt.:


> ```
> while( !feof(&fp))
> {
> fgets(&get,128,&fp);
> ...


Besser wäre 
	
	
	



```
fgets(get, 128, &fp);
```
.



AsaTru hat gesagt.:


> In einem anderen Thread wurde das ganze so gelöst:
> 
> ```
> FILE *f = fopen( "test.txt", "r" ) ;
> ...


Das Programm liest nicht nur die letzte, sondern alle Zeilen aus. Es speichert aber höchstens eine Zeile zwischen. Willst du sämtliche Zeilen in den Arbeitsspeicher einlesen? Dann wirst du vermutlich Probleme mit dem begrenzten Speicher deines Mikrocontrollers (8K, wenn ich das Datenblatt richtig interpretiert habe) kriegen. Ansonsten probier mal mit malloc() entsprechenden Speicher zu reservieren.

Grüße, Matthias


----------



## AsaTru (18. Juli 2009)

Vielen Dank für deine Antwort.

Also ich hab eine Platine auf der sich der Controller und ein Speicherbaustein(8MB) befinden,  da der Speicher des Controllers ziemlich begrenzt ist wie du schon richtig geschrieben hast, sollen die Bilder auf dem Speicherbaustein gespeichert werden. Der Controller soll diese dann Zeile für Zeile auslesen und an einem Port ausgeben. Die Daten werden an ein Display geschickt und sollen dort angezeigt werden.

Das mit dem USB war so gemeint, das ich Daten per USB auf den Speicherbaustein Speichern kann. Quasi wie ein USB-Stick.



> Das Programm liest nicht nur die letzte, sondern alle Zeilen aus. Es speichert aber höchstens eine Zeile zwischen. Willst du sämtliche Zeilen in den Arbeitsspeicher einlesen? Dann wirst du vermutlich Probleme mit dem begrenzten Speicher deines Mikrocontrollers (8K, wenn ich das Datenblatt richtig interpretiert habe) kriegen. Ansonsten probier mal mit malloc() entsprechenden Speicher zu reservieren.



Ah okay, also liest er alle aus und Speichert höchstens eine. Liest er die Zeilen einzeln? Also zuerst die Erste, dann springt er zur Zweiten usw.? Könnte man dann nicht bevor er zur nächsten Zeile springt, die aktuelle zwischenspeichern? Diese schicke ich dann an das Display und er geht auf die nächste Zeile, liest diese aus und diese wird dann auch an das Display geschickt. Solange bis er am Ende der Datei angekommen ist. 

Ich versuche mein Problem mal genauer zu beschreiben: :

Ich hab ein Logo einer Firma als .bmp Datei auf dem Speicherbaustein gespeichert. Dieses Bild möchte ich auf dem Display anzeigen. Da der Speicher des Controllers sehr begrenzt ist, möchte ich das Bild Zeile für Zeile auslesen. 
Das Bild besteht aus genau 1349 Zeilen. Eine bestimmte Zeile auszulesen ist kein Problem. Aber ich möchte, das das Programm die Zeilen schrittweise ausliest und mir die aktuelle an das Display ausgibt und danach die nächste ausliest, diese dann auch ausgibt usw. bis die Datei zu ende ist.

Ich hab das ganze mal mit einer Schleife versucht:


```
for ( i = 0; i < 1300; i++)
{
fgets(get,128,&fp);
Show_64k_Pattern(get,0x00,0x9F,0x00,0x7F);
}
```
Aber er liest jetzt wohl auch nur die Letzte Zeile und gibt diese aus.  Der Show_64k Befehl ist aus dem Programm des Displays und funktioniert soweit, allerdings war bei dem Programm das Bild schon im Code mit drin. 

Also ich brauche irgendwas, was von Zeile zu Zeile springt, die Daten ausliest, ans Display schickt und danach die nächste Zeile angeht.

Ich bin wirklich für jede Hilfe dankbar.


----------

