Textdatei: bestimmte Zeile ausgeben



  • Der Standard definiert argc und argv wie folgt:

    ISO/IEC 9899:1999 5.1.2.2.1 (2) schrieb:

    If they are declared, the parameters to the main function shall obey the following
    constraints:
    — The value of argc shall be nonnegative.
    — argv[argc] shall be a null pointer.
    — If the value of argc is greater than zero, the array members argv[0] through argv[argc-1] inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program startup. The intent is to supply to the program information determined prior to program startup from elsewhere in the hosted environment. If the host environment is not capable of supplying strings with letters in both uppercase and lowercase, the implementation shall ensure that the strings are received in lowercase.
    — If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. If the value of argc is greater than one, the strings pointed to by argv[1] through argv[argc-1] represent the program parameters.
    — The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.

    ...woraus sich ergibt, dass argv[0] keinesfalls undefiniert ist. Allerdings kann es passieren, dass argc == 0 ist (etwa bei merkwürdige exec*-Aufrufen), in welchem Fall argv[0] == NULL und

    fprintf (stderr, "usage: %s filename\n", argv[0]);
    

    undefiniert ist.

    Was das ursprüngliche Problem angeht, mit "Rest unverändert" meinte ich, dass die get_line-Funktion aus dem vorherigen Codestück unverändert übernommen werden sollte.

    Die Kritik am fseek-Ansatz ist prinzipiell berechtigt; der C-Standard scheint sich nicht mit dem Gedanken zu befassen, dass Daten größer als LONG_MAX werden könnten und definiert die Fähigkeiten von fseek generell ziemlich eng. Da aber sowohl POSIX als auch die MSDN zusätzliches Verhalten definieren, welches die Anwendung von fseek vereinfacht, sollte man so ziemlich überall mit

    fseek(fd, i, SEEK_END);
    

    und negativem i davonkommen.

    Allerdings ist das nicht unbedingt ein performanter Ansatz, zumindest nicht in der angegebenen Form, wo jeweils ein Zeichen zurückgesucht wird. Es hängt vom darunterliegenden Medium ab - nehmen wir, wegen der extremen Anschaulichkeit beispielsweise ein Kassettenlaufwerk und stellen uns vor, wie sich das verhielte, wenn man ihm ein "ein Zeichen vor, zwei Zeichen zurück"-Suchmuster gäbe. Wie auch bei der getline-Funktion scheint es sinnvoll, die Daten blockweise einzulesen und im Speicher nach Zeilenumbrüchen zu suchen.

    Und Wutz, du solltest wirklich aufhören, Anfängern deine grauenvoll ineffiziente getline-Implementation aufs Auge zu drücken. Jemand könnte auf die Idee kommen, sie zu verwenden.



  • Sowohl realloc als auch fgetc/setvbuf arbeiten nicht zeichen- sondern blockweise, was Leute mit beschränktem Horizont leicht übersehen.



  • Hi Jungs
    Also sorry, egal welchen eure Codes ich bei mir in Visual STudio reinhau, er sagt jedes mal beim debuggen okay und beim öffnen der Konsolenanwendung öffnet die Konsole kurz und schließt sich gleich wieder

    "The program '[5164] PPSTEST.exe: Native' has exited with code 0 (0x0)."



  • ist doch super, heißt soviel wie "alles richtig gemacht".



  • Wutz schrieb:

    Sowohl realloc als auch fgetc/setvbuf arbeiten nicht zeichen- sondern blockweise, was Leute mit beschränktem Horizont leicht übersehen.

    Nette Behauptung. Sie ist nur stumpf nicht wahr - lies es im Standard nach (7.20.3.4).

    Das wäre dir übrigens auch aufgefallen, wenn du mal einen Debugger auf das Programm losgelassen hättest. Mit __FILE__ statt "blabla.txt" in deinem Code meint valgrind Folgendes:

    ==30558== Memcheck, a memory error detector
    ==30558== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
    ==30558== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
    ==30558== Command: ./a.out
    ==30558== 
    }
    ==30558== 
    ==30558== HEAP SUMMARY:
    ==30558==     in use at exit: 0 bytes in 0 blocks
    ==30558==   total heap usage: [b]464 allocs, 464 frees, 6,509 bytes allocated[/b]
    ==30558== 
    ==30558== All heap blocks were freed -- no leaks are possible
    ==30558== 
    ==30558== For counts of detected and suppressed errors, rerun with: -v
    ==30558== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
    

    ...und das für 494 Byte in 32 Zeilen!

    Du bist inzwischen lange genug dabei, um dir um Effizienz Gedanken zu machen und Behauptungen in diese Richtung zu prüfen, bevor du sie machst. Einen beschränkten Horizont lasse ich mir angesichts dieser Leistung von dir ganz bestimmt nicht vorwerfen.

    @chicksgirl: Das sieht mir nach MSVC aus. Probier's mal mit Strg + F5 (wenn ich das gerade richtig im Kopf habe). Wenn du es mit "Debuggen" starten willst, setz halt einen Haltepunkt in die letzte Zeile.



  • Starte Dein Konsolenprogramm aus der Konsole!



  • wie mache ich das ?



  • chicksgirl schrieb:

    wie mache ich das ?

    rtfm?



  • Ne das lag dadran, dass kein system("pause") eingefügt war!!!
    Jetzt hab ichs eingefügt, programm schmiert immer ab und Konsole bleibt NICHT offen !?!?! WOrang liegt das ?
    hab für den filname mdie Adresse eingegeben wo er die daten ziehn soll, also Z\\blabla.txt



  • chicksgirl schrieb:

    WOrang liegt das ?

    rtffaq:
    http://www.c-plusplus.net/forum/111042
    🙂

    Mit C hat das übrigens gar nichts zu tun.



  • sorry, aber funktioniert trotz einfügen der WAIT-Funktion nicht.
    Weis leider nicht woran es liegt ^^ bin schon die ganze Zeit am rumprobieren, Funktion klappt aber leider nicht 😞



  • chicksgirl schrieb:

    sorry, aber funktioniert trotz einfügen der WAIT-Funktion nicht.

    Dann wirst du wohl nicht um das Manual oder das passende Unter-Forum herumkommen.



  • Da die Programmbeispiele ja schon 6 Tage alt sind und du auch ein bischen rumgespielt hast, poste doch mal dein aktuellen Code.

    Schreib auch bitte wie du das Programm startest und was passiert.



  • DirkB schrieb:

    Da die Programmbeispiele ja schon 6 Tage alt sind und du auch ein bischen rumgespielt hast, poste doch mal dein aktuellen Code.

    Frag dich mal wie ernst man Leute nehmen soll, die in ihrem Namen demonstrativ auf ihr weibliches Geschlecht hinweisen.
    🙂



  • Oh man,
    soll das heißen nur weil ich ne Frau bin, dass ich manches nicht raffe ? Wie am Anfang schon gesagt, ich kenne mich in C und C++ aus nur eben nicht perfekt. Dazu gehört eben die Tatsache, dass ich einfach nicht weis wie man eine bestimme Zeile aus ner .txt ausgiebt !!
    Und wenn ich die Codes die manche hier reingeschrieben hab compilieren lasse und NCIHTS funktioniert, sprich die Konsole nicht offen bleibt (was sie bei meinen Programmen tut) dann poste ich das eben mal.

    Und falls es dir lieber ist wenn ich mich, wie du, XLKDF oder WTF"§$ nenne, dann mache ich das eben das nächste mal so!



  • ach beachte ihn nicht...

    poste mal deinen gesammten source-code... kann sein dass du was übersehen hast, passiert mir auch öfters, vorallem weil ich auch noch nicht ausgelernt bin und Fehler menschlich sind.

    @mngbd: frauenfeindlichkeit kann man glaube ich als beleidigung bezüglich einer gesamtheit betrachten. Und im Forum gehört Höflichkeit zum Altag! Sie könnte dich normalerweise melden!



  • Das war sicher nicht Frauenfeindlich gemeint.
    Eher in diesem Sinn: http://www.heise.de/ct/schlagseite/2000/14/gross.jpg



  • naja, wie er es gemeint hat ist jetzt zweitrangig, da dies ja nicht das thema des threads ist...



  • chicksgirl schrieb:

    Ne das lag dadran, dass kein system("pause") eingefügt war!!!
    Jetzt hab ichs eingefügt, programm schmiert immer ab und Konsole bleibt NICHT offen !?!?! WOrang liegt das ?

    Nochmal:
    Starte Dein Programm aus der Konsole!
    Wenn Du Windows benutzt, dann:
    Start/Programme/Zubehör/Eingabeaufforderung

    oder:

    Start/Ausführen -> cmd

    dann öffnet sich ein Konsolenfenster. Darin navigierst Du via cd zu dem Verzeichnis, in dem Deine exe - Datei liegt. Dann tippst Du den Namen der exe - Datei ein, drückst return und Dein Programm wird gestartet - und ... die Konsole bleibt offen.



  • Belli schrieb:

    chicksgirl schrieb:

    Ne das lag dadran, dass kein system("pause") eingefügt war!!!
    Jetzt hab ichs eingefügt, programm schmiert immer ab und Konsole bleibt NICHT offen !?!?! WOrang liegt das ?

    Nochmal:
    Starte Dein Programm aus der Konsole!
    Wenn Du Windows benutzt, dann:
    Start/Programme/Zubehör/Eingabeaufforderung

    oder:

    Start/Ausführen -> cmd

    dann öffnet sich ein Konsolenfenster. Darin navigierst Du via cd zu dem Verzeichnis, in dem Deine exe - Datei liegt. Dann tippst Du den Namen der exe - Datei ein, drückst return und Dein Programm wird gestartet - und ... die Konsole bleibt offen.

    Oder eine Batch Datei erstellen im .exe Verzeichnis

    program.exe
    pause
    

    Gruss Sheldor


Anmelden zum Antworten