Gerd schrieb:> hat jemand einen schnelleren code oder Tips für diese Aufgabe ?
auf jeden Fall die Datei nicht 2mal lesen. Du hast doch schon alle
zeichen gelesen warum dann noch mal lesen?
wo lese ich die Datei 2mal?
Die Datei hat unterschiedlich lange Zeilen.
Ich lese in einen buffer die maximale Länge einer Zeile im Beispiel 55
Zeichen.
Nach dem lesen sollte der Zeiger der Datei am Anfang der nächsten Zeile
stehen.
Gerd schrieb:> wo lese ich die Datei 2mal?
da hatte ich mich wohl verkuckt. Ich dachte das Readline steht noch in
der funktion und es eine art Rekursion.
Aber das mit dem dem Seek macht für mich keinen sinn. Du müsstest doch
automatisch auf der nächste zeile stehen wenn du das \n eingelesen hast.
Gerd schrieb:> Nach dem lesen sollte der Zeiger der Datei am Anfang der nächsten Zeile> stehen.
Tut er das nicht nach dem Lesen sowieso?
Ein Zeichen suchen (z.B. das \n) kann man auch mit strchar().
Moin,
schau Dir mal fgets an!
char *fgets(char *puffer, int n, FILE *datei);
Die Funktion liesst entweder n Zeichen oder bis \n je nachdem, was als
erstes anschlägt. Dann brauchst Du nicht blockweise lesen und das
nochmalige durchlaufen des Strings entfällt.
Rosa
ich lese von sd Karte.
Die Funktion um ein einzelnes Zeichen zu lesen gibt es, ist aber
langsamer wie eine feste Länge an Zeichen zu lesen:
read(fd, line, len);
ich bräuchte die Funktion getline, der obige code ist mein Ansatz dazu.
Gerd schrieb:> Die Funktion um ein einzelnes Zeichen zu lesen gibt es, ist aber> langsamer wie eine feste Länge an Zeichen zu lesen:
Du glaubst wirklich, die längere Laufzeit zum Lesen einzelner Zeichen
ist irgendwie relevant im Vergleich zum ersten Zugriff auf eine
SD-Karte?
Wenn die Funktionenn nicht vollkommen debil implementiert sind, lesen
sie einen Sektor oder mehr auf einmal.
Das kostet beim ersten Mal mehr Zeit; egal ob mit read() oder
zeichenweise.
Ab dann wird aus dem vorhandenen Puffer gelesen; da wäre read()
schneller - aber das fällt nicht auf im Vergleich zum Lesen des Puffers
von der Karte.
Klaus Wachtler schrieb:> Gerd schrieb:>> Die Funktion um ein einzelnes Zeichen zu lesen gibt es, ist aber>> langsamer wie eine feste Länge an Zeichen zu lesen:>> Du glaubst wirklich, die längere Laufzeit zum Lesen einzelner Zeichen> ist irgendwie relevant im Vergleich zum ersten Zugriff auf eine> SD-Karte?
@Gerd
Abgesehen davon, ist die Funktion sowieso falsch.
Und was Laufzeit anbelangt: Na dann warte mal ein bischen, bis bei dir
das erste mal das Satzende knapp vor einem Sektorwechsel zu liegen
kommt.
Warum glaubt eigentlich jeder Anfänger, er könne Funktionen mit seinem
begrenzten Wissen und begrenzter Übung besser implementieren, als
derjenige der eine Library gebaut hat und damit schon dokumentiert hat,
dass er Ahnung von der Sache hat.
Peter Stegemann schrieb:> Tip: Erst mal zeichenweise sauber implementieren, dann ueber> Optimierungen Gedanken machen.
Wobei der erste Schritt darin besteht, sich zu fragen:
Ist das schnell genug?
Wenn man die Antwort nicht weiß, dann müssen Zahlen her. Meist gewinnt
man die mit einem Profiler. Wenn sich dann rausstellt, dass die bewusste
Routine lediglich ein paar Prozent im einstelligen Prozentbereich
verbraucht, kann man getrost davon ausgehen, dass sie schnell genug ist
und sein Optimierungspotential erst mal an anderer Stelle austoben.
Dort, wo Optimierungen dann auch tatsächlich was bringen.
>Warum glaubt eigentlich jeder Anfänger, er könne Funktionen mit seinem>begrenzten Wissen und begrenzter Übung besser implementieren, als>derjenige der eine Library gebaut hat und damit schon dokumentiert hat,>dass er Ahnung von der Sache hat.
Woher weisst Du, dass derjenige, der die Lib implementiert, auch Ahnung
von der Sache hat? Auch der hat mal klein angefangen genauso, wie Du! Es
fällt kein Meister vom Himmel, wie Du weisst...
An Gerd: Schau Dir doch einfach die Implementierung von fgets an.
Vielleicht kannst Du Teile davon wiederverwenden.
Rosa
Rosa-Kleidchen schrieb:>>Warum glaubt eigentlich jeder Anfänger, er könne Funktionen mit seinem>>begrenzten Wissen und begrenzter Übung besser implementieren, als>>derjenige der eine Library gebaut hat und damit schon dokumentiert hat,>>dass er Ahnung von der Sache hat.> Woher weisst Du, dass derjenige, der die Lib implementiert, auch Ahnung> von der Sache hat?
Weil man eine SD Library nicht einfach so schreibt.
Wer in der Lage ist, einen lauffähigen Verbrennungsmotor zu bauen, dem
traue ich ohne näher hinzusehen ohne Weiteres zu, dass er mit Säge und
Feile umgehen kann.
> Auch der hat mal klein angefangen genauso, wie Du!
Hat er. Ganz sicher sogar. Aber du kannst ohne mit der Wimper zu zucken
davon ausgehen, dass eine SD-Library nicht seine erste
Programmieraufgabe ist.
Gerd schrieb:> Hallo Rosa,>> wo findet man diese Implementierung?
Wie heißt denn deine Funktion zum Einzelzeichenlesen in der SD-Library?
Ich nehme mal an, die heißt getc
1
intgets(char*buffer,intn,intfd)
2
{
3
charc=getc(fd);
4
intcharsRead=0;
5
6
while(c!='\n'&&n>0){
7
*buffer++=c;
8
charsRead++;
9
c=getc(fd);
10
}
11
12
*buffer='\0';
13
14
returncharsRead;
15
}
Die Verwaltung der Blöcke und weiterschalten in den nächsten Block
überlasst du sinnvollerweise der getc() Funktion.
Deine eof Behandlung ist noch falsch.
Auch während des Einlesens kann nach jedem Versuch ein Zeichen zu lesen
ein eof-Fall auftreten.
Und die Behandlung des Falles, das der Buffer voll geworden ist, ist
denke ich auch noch falsch. In Buffer dürfen nicht mehr als n Zeichen,
inklusive dem abschliessenden '\0' geschrieben werden. (Das hab ich
allerdings in der Vorlage auch verbockt)
Und weil das oft (auch in Büchern) falsch gemacht wird:
eof wird erst dann true, wenn ein Leseversuch gescheitert ist. C
versucht nicht, wie andere Sprachen, in die Zukunft zu schauen. Du
machst einen Aufruf einer Lesefunktion, der hat nichts mehr zum Lesen
und erst danach wird eof gesetzt. eof ermöglicht einem also im
Nachhinein festzustellen, ob der Leseversuch geklappt hat und nicht im
vorhinein festzustellen, ob der nächste Leseversuch klappen wird.
Ich hoffe mal, dass deine SD-Library in dieser Hinsicht auch korrekt
programmiert ist.
Soso, Karl Heinz Buchegger, soso, Verbrennungsmotor, tssss.
Jeder kleine Freak baut Dir irgendeine Lib, aber bestimmt keinen
Verbrennungsmotor. Äpfel und Birnen kann sogar ein Bauer vergleichen.
Rosa