Gast
#2251377
Hallo, ich lese mit dieser Funktion eine Zeile aus einer Datei:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
hat jemand einen schnelleren code oder Tips für diese Aufgabe ?
|
Anzeige
|
Frage zu String einlesen
Gast
#2251377
Hallo, ich lese mit dieser Funktion eine Zeile aus einer Datei:
hat jemand einen schnelleren code oder Tips für diese Aufgabe ?
Gast
#2251380
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?
Gast
#2251398
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.
Gast
#2251404
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().
Gast
#2251425
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
Gast
#2251433
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.
Gast
#2251440
Hallo Rosa Kleidchen, ja das wäre die richtige Funktion, leider gibt es die nicht in meiner sd Karte library.
Gast
#2251451
Äh... zufällig gleiches Problem oder gleiche Person? Beitrag "Textfile zeilenweise von SD-Karte lesen" 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. abc123 schrieb: > Äh... zufällig gleiches Problem oder gleiche Person? Vielleicht beide in der gleichen Klasse? :-) 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.
Gast
#2251879
Tip: Erst mal zeichenweise sauber implementieren, dann ueber Optimierungen Gedanken machen. 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.
Gast
#2252444
>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
Gast
#2252487
Hallo Rosa, wo findet man diese Implementierung? 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
Die Verwaltung der Blöcke und weiterschalten in den nächsten Block überlasst du sinnvollerweise der getc() Funktion.
Gast
#2253763
DANKE so hab ichs jetzt:
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.
Gast
#2253876
OK Danke für die Hinweise Ich hoffe so passt es:
Gast
#2254253
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 Ach weißt du was Rosa ..... Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|