cURL einfach in C verwenden?


  • Mod

    Nicht im Forum programmieren, sonst weiß man nicht, ob das nun echte Fehler oder Tippfehler sind. Copy&Paste. Beispielsweise ist hier offensichtlich, dass die Anführungsstriche nicht passen, wie man an der Formatierung erkennt. Weiterhin ist eine Zeichenkette in Form von ints offensichtlich Unsinn, aber aus oben erwähntem Grund weiß ich nun nicht, ob das echter Unsinn oder ein Abschreibfehler ist. Genauer schaue ich mir den Code daher vorerst nicht an.



  • Wieviel Daten und möchtest du einlesen? (wie groß ist die Datei, wenn du die Daten in einer speicherst, z.B. von der Kommandozeile aus)

    Ist die Datei immer so groß?

    Daraus solltest du die Größe für dein Array ableiten.
    Und du mußt überprüfen, ob du nicht schon die Arraygrenze erreicht hast.

    Aber dann kannst du auch fread nehmen.

    PATH_MAX wird durch den Wert für maximale Größe eines Dateinamens incl. der Verzeichnisse erstzt.
    Dieser ist systemabhängig.
    Ich denke, das ist für dein Problem der völlig falsche Wert. (auch wenn er ausreichend groß ist)



  • SeppJ schrieb:

    Nicht im Forum programmieren, sonst weiß man nicht, ob das nun echte Fehler oder Tippfehler sind. Copy&Paste. Beispielsweise ist hier offensichtlich, dass die Anführungsstriche nicht passen, wie man an der Formatierung erkennt.

    Ja das stimmt. Hatte einen Schrägstrich vergessen. Ich hab nur meine Authorisierung und die url rausgelöscht, das ist nur unnötiger Ballast.

    SeppJ schrieb:

    Weiterhin ist eine Zeichenkette in Form von ints offensichtlich Unsinn, [...]

    Naja, ich hab das gemacht, weil mir fgetc () ein integer zurückgibt. Wäre ja gut, wenn es eine Funktion gibt, die einem gleich char zurückgibt.

    DirkB schrieb:

    Wieviel Daten und möchtest du einlesen? (wie groß ist die Datei, wenn du die Daten in einer speicherst, z.B. von der Kommandozeile aus)

    Ist die Datei immer so groß?

    Die Datei ist an sich immer gleich groß. Vielleicht mal 1 Byte mehr oder weniger. Ja ich könnt manuell die Dateigröße bestimmen und dann den Array halt so groß machen. Cooler wäre natürlich, wenn das Programm das selber feststellt, irgendwie über EndOFFile. Naja aber nicht so wichtig.

    Bei fread gibt er mir einen unsigned int zurück. Hmm ist das soviel anders? Und was ist ein Block. Ist ein Zeichen ein Block?

    Ich mach es schon umständlich. Ich bekomme einen string und wandle den in integer um, um ihn dann wieder in einen string zu wandeln. Will dort dann nach Wörtern in der Zeichenkette suchen.

    DirkB schrieb:

    PATH_MAX wird durch den Wert für maximale Größe eines Dateinamens incl. der Verzeichnisse erstzt.
    Dieser ist systemabhängig.
    Ich denke, das ist für dein Problem der völlig falsche Wert. (auch wenn er ausreichend groß ist)

    Ok danke. Es gibt nicht zufällig eine Konstante wie vielleicht FILE_MAX? Ich hätte 10 Zeichen in meiner Datei und FILE_MAX macht meinen Array dann 10 groß?



  • qweet schrieb:

    int main(void) {
        FILE *fp;
        int i=0, j=0;
        int c;
        int string[PATH_MAX];
    
        fp = popen("curl -H \"Authorization: \" -X GET \"url\"","r");
    
        if (fp == NULL) {
            printf("Konnte Datei nicht öffnen!\n");
        }
    
        while( (c=fgetc(fp)) != EOF) {
             string[i] = c;
             i++;
        }
        fclose (fp);
        j = i;
    
        for(i=0; i<=j; i++) {
            putchar(string[i]);
        //    printf ("%i",string[i]);
        }
    
        return 0;
    }
    

    - int string[] ist Unsinn, sollte char string[] heißen
    - PATH_MAX ist unpassend für diesen Zweck, diese Größe muss du selbst festlegen
    - nach fp == NULL darf fp nicht mehr verwendet werden
    - for(i=0...) läuft zu weit
    - string wahrscheinlich nicht terminiert (musst du selbst machen), wenn du ihn anschließend als C-String verwenden willst
    - dein ganzer Ansatz ist unflexibel, was machst du, wenn du mal mehr als einen String/eine Zeile bekommst?

    #define _POSIX_C_SOURCE 200809L
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	enum{MAXSTRLEN=50000};
    
    	FILE *f = popen("uname -a","r");
    	if(!f)
    		return 1;
    	char *string = calloc(MAXSTRLEN+1,1);	
    	size_t n=fread(string,1,MAXSTRLEN,f);
    	if(!ferror(f))
    		printf("%zu Zeichen gelesen: %s",n,string);
    	fclose(f);
    	free(string);
    	return 0;
    }
    

    https://ideone.com/x5Cg6m

    Für mehrere Strings/Zeilen nimmst du dann eine Stringliste, d.h. für jede Zeile einen String in der Liste und verwendest praktischerweise dann getline() (POSIX, denn du bist mit popen sowieso schon in POSIX unterwegs), das kann das Speicherhandling für dich übernehmen.


Anmelden zum Antworten