Guten Morgen ich habe eine C Konsolenanwendung in Visual Studio mit
dieser
soll eine sehr große Datei (~8MByte) eingelesen werden. Für das Einlsen
nutze ich die Funktion fopen.
Das geht so nicht.
Ist in VB genau das selbe da geht es auch nicht.
Du musst in den Projekteigenschaften und Debugging in
Befehlszeilenargument die Datei angeben.
Den Dateinamen erhälts du dann via Environment Befehlsfunktion.
Hab noch eine Frage bezüglich Präprozessoranweisungen.
Ich benötige quasi einen Softwareschalter. Leider weiß ich nicht warum
dies so nicht funktioniert.
fehlt da nicht ein zweites fseek, um vor dem fread wieder an den Anfang
der Datei zurückzuspringen?
und wegen dem Präprozessor:
#ifdef prüft, ob etwas definiert ist.
also
Εrnst B. schrieb:> fehlt da nicht ein zweites fseek, um vor dem fread wieder an den Anfang> der Datei zurückzuspringen?>
War auch mein erster Gedanke.
Es bringt doch nichts, am Dateiende zu lesen.
Jo schrieb:> #define FALSE = 0> #define TRUE = !FALSE> #define TEST FALSE
Wird das #define jetzt mit = oder ohne gemacht.
Entscheide dich. :-)
Einfacher ist es, TEST nur für den Testfall zu definieren.
Im normalfall gibt es das nicht.
Jo schrieb:> buffer = (char*)malloc(fileLen + 1); /* Speicher reservieren */
Wenn deine Datei genau 4 GB groß ist, dann läuft diese Berechnung über
und zu alloziierst 0 Bytes. In weiteren Verlauf schreibst du dann deine
4 GB in den nicht ganz so großen Puffer.
Jo schrieb:> Egal wie funktioniert nicht
Das funktioniert definitiv, wenn man es richtig macht.
d.H. die korrekte Variante war bei deinem "Egal wie" nicht dabei.
Dirk B. schrieb:> Einfacher ist es, TEST nur für den Testfall zu definieren.> Im normalfall gibt es das nicht.
Man deklariert TEST as Boolean wenn man am Entwicklen ist.
Das setzt man in der Start-Routine auf TRUE und gut ist.
Ich benutze das z.b. wenn ein Prg. zwingend eingaben des Users erwartet
und ich zu Faul bin die jedes mal einzugeben.
Also wird beim Klick auf den Button folgendes gemacht.
If Test = true then
hp_e_eingabe1.text = "fdsfs"
hp_l_liste.selectedindex = 3
end if
Danach die User-Fehler-Behandlung die er ja jetzt erfolgreich besteht.
und dann die Programmausführung.
So eine Vorgehensweise spart ein Stunden an Arbeit.
Man darf nur nicht vergessen das hinterher TEST auf FALSE zu setzen.
Hinweis : Ist zwar Basic-Code geht aber in JEDER Programmiersprache.
!!!!
Schlaumaier schrieb:> Man deklariert TEST as Boolean wenn man am Entwicklen ist.>> Das setzt man in der Start-Routine auf TRUE und gut ist.>> Ich benutze das z.b. wenn ein Prg. zwingend eingaben des Users erwartet> und ich zu Faul bin die jedes mal einzugeben.>> Also wird beim Klick auf den Button folgendes gemacht.>> If Test = true then> hp_e_eingabe1.text = "fdsfs"> hp_l_liste.selectedindex = 3> end if
Da wird es erst zur Runtime entschieden.
Bei der bedingten Compilierung mit Makros passiert das aber schon zur
Buildtime.
Daher ist das nicht vergleichbar.
höre nicht auf das Geschrei vom Schlaumeier, der kennt offensichtlich
den Unterschied zwischen bedingter Komplierung und Laufzeitabfragen
nicht.
Den Debug Müll möchte man im Release nicht drin haben und dafür ist die
bedingte Kompilierung schon richtig. Es gibt üblicherweise fertige
Makros für Ausgaben im Debug Build oder Assert Makros die einen
Laufzeitfehler erzeugen wenn eine Bedingung nicht erfüllt ist.
Lies dir lieber die Beiträge von Ernst B. nochmal durch.
J. S. schrieb:> höre nicht auf das Geschrei vom Schlaumeier, der kennt offensichtlich> den Unterschied zwischen bedingter Komplierung und Laufzeitabfragen> nicht.
Der kennt ja auch nur Basic.
Allerdings schmeißt jeder anständige C-Compiler bei eingeschalteter
Optimierung den Debug-Code auch schon zur Compilezeit raus. Der
Unterschied zum define ist da eher theoretisch.
Oliver
Muss man bei Windows nicht fopen("blabla.txt", "rb") benutzen für
fread/fwrite?
So wie es kenne, muss "binary mode" unter Windows explizit angegeben
werden.
MaWin schrieb:> Aber wozu auch?
Um sicherzustellen, dass nicht irgendwelche Annahmen aus C-Büchern aus
dem letzten Jahrtausend auf eine aktuelle Standard-Library ungeprüft
übernommen werden. Ich hatte die Signatur von fread() nicht mehr parat,
da ich VisualStudio hier nicht installiert habe.
Walter T. schrieb:> Ich hatte die Signatur von fread() nicht mehr parat,> da ich VisualStudio hier nicht installiert habe.
Ein "man fread" bei google ist da hilfreich.
Jo schrieb:> Leider weiß ich nicht warum dies so nicht funktioniert.
#define macht eine Textersetzung. Späteres Auftreten des Makro-Namens
wird durch das, was beim #define dahinter stand, ersetzt. Also:
> #define FALSE = 0
Jedes 'FALSE' wird durch '= 0' ersetzt.
> #define TRUE = !FALSE
Jedes 'TRUE' wird durch '= !FALSE' und das wiederum durch '= !0'
ersetzt.
> #define TEST FALSE
Jedes 'TEST' wird durch '= 0' ersetzt.
> int main()> {> #ifdef TEST == TRUE
Hier kommt also raus:
1
#ifdef = 0 == = !0
Es sollte nicht verwundern, dass das nicht funktioniert.
Du hast mit fseek den filepointer an das Dateiende gesetzt um die
Dateigröße zu bestimmen. Nun musst du den Pointer zurück auf den Start
setzen, dann geht's.
Martin K. schrieb:> Du hast mit fseek den filepointer an das Dateiende gesetzt um die> Dateigröße zu bestimmen. Nun musst du den Pointer zurück auf den Start> setzen, dann geht's.
Soweit waren wir schon am 25.07.2022...