Forum: PC-Programmierung Visual Studio C


von Jo (Gast)


Angehängte Dateien:

Lesenswert?

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

von Nachdenklicher (Gast)


Lesenswert?

Da der Fehler in fseek() aufzutreten scheint, rate ich mals ins Blaue: 
Datei konnte nicht geöffnet werden. (Falscher Pfad oder so...)

von Oliver S. (oliverso)


Lesenswert?

fopen (und alle weiteren Filefunktionen) teilen dir Fehler mit. Du musst 
die nur danach fragen.

Bei malloc machst du es ja auch.

Oliver

von Jo (Gast)


Lesenswert?

Ok der Pfad war falsch.

von Gerald K. (geku)


Lesenswert?

fseek mit ungültigem FilePointer?

von Schlaumaier (Gast)


Lesenswert?

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.

von Jo (Gast)


Lesenswert?

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
}

von Εrnst B. (ernst)


Lesenswert?

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

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Ε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.

von Jo (Gast)


Lesenswert?

Das mit #if funktioniert nicht:

#if TEST == TRUE

>> Ungültiger Ausdruck für Ganzzahlkonstante

von Dirk B. (dirkb2)


Lesenswert?

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.

von Jo (Gast)


Lesenswert?

Egal wie funktioniert nicht

von MaWin (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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. 
!!!!

von Jo (Gast)


Lesenswert?

Ok danke

Beitrag #7138529 wurde vom Autor gelöscht.
von Dirk B. (dirkb2)


Lesenswert?

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.

von J. S. (jojos)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Walter T. (nicolas)


Lesenswert?

Bist Du sicher, dass fread() chars einliest?

von MaWin (Gast)


Lesenswert?

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.

von binary (Gast)


Lesenswert?

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.

von Walter T. (nicolas)


Lesenswert?

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.

von binary (Gast)


Lesenswert?

Jo schrieb:
> Ich benötige quasi einen Softwareschalter.

gibt es schon, heißt NDEBUG

kann man beim Kompilieren automatisch deaktivieren.

von Dirk B. (dirkb2)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

: Bearbeitet durch User
von Martin K. (kmcontact)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.