Visual Studio C

Gast #7138353
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.
1
   filePointer = fopen("LogFile.log", "r");
2
    fseek(filePointer, 0, SEEK_END);
3
    uint32_t fileLen = ftell(filePointer);
4

5
    buffer = (char*)malloc(fileLen + 1); /* Speicher reservieren */
6
    if (!buffer)
7
    {
8
        fprintf(stderr, "Memory error!");
9
        fclose(filePointer);
10
        return;
11
    }
12
  
13
    fread(buffer, fileLen, 1, filePointer); /* Datei lesen und in Puffer ablegen */
14
    fclose(filePointer);

Wenn ich die Konsolenanwendung in der Cmd Box ausführe erscheint diese 
Fehlermeldung: sie Bild im Dateianhang
Angehängte Dateien:
Gast #7138410
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.
Gast #7138463
Hab noch eine Frage bezüglich Präprozessoranweisungen.
Ich benötige quasi einen Softwareschalter. Leider weiß ich nicht warum 
dies so nicht funktioniert.
1
#define FALSE = 0
2
#define TRUE = !FALSE
3

4

5
#define TEST FALSE  
6

7
int main()
8
{
9
#ifdef TEST == TRUE
10

11
#endif
12
}
#7138469
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
1
#ifdef DEBUG
2
...
3
#endif

#if kann vergleichen,also:
1
#if MODE == TEST
2
...
3
#endif
Gast #7138495
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.
Gast #7138502
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. 
!!!!
Beitrag #7138529 wurde von einem Moderator gelöscht.
#7138531
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.
#7138534
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.
#7138543
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
Gast #7138638
Walter T. schrieb:
> Bist Du sicher, dass fread() chars einliest?

nö. Aber wozu auch?
1
       size_t fread(void *restrict ptr, size_t size, size_t nmemb,
2
                    FILE *restrict stream);
3

4
       The  function  fread() reads nmemb items of data, each size bytes long,
5
       from the stream pointed to by stream,  storing  them  at  the  location
6
       given by ptr.
Gast #7138663
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.
#7139743
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.