C Dateipfad in C einlesen.

Zkor

Lt. Junior Grade
Registriert
Juli 2007
Beiträge
294
Hi Leute!

Ich habe den Auftrag bekommen ein einfaches Programm zu schreiben, welches die Zahlenfolgen eines Textes von Hexadezimale in Ascii umwandelt.

Dazu möchte Ich einerseits die Textdatei öffnen können (hier entsteht das Problem) und andererseits in einen beliebigen Pfad mit Dateinamen abspeichern können.

Mein erster Versuch sieht so aus:

HTML:
void txtfinder()
{
    char pfad[50];
    printf("\nBitte den Pfad angeben\n");
    scanf("%s", &pfad);
    FILE *text;
    text = fopen ("[B][I]pfad[/I][/B]", "r");
        if(text == NULL)
		{
		printf("\nDie Datei konnte nicht geöffnet werden");
		getchar();
		exit(0);
		}
    /* Schleifen und so*/
    fclose (text);
}

Wobei anstelle von Pfad natürlich der wirkliche Pfad stehen müsste.
Da mein Kunde alles über die Konsole steuern möchte ist ein Define am Programmanfang ausgeschlossen.
Gibt es eine Möglichkeit den Dateipfad einzulesen und in die Anweisung einzufügen?

Danke schonmal vielmals!
 
Erstmal ein Tipp für "Konsolenprogrammierung":

Lass das Programm beim Aufruf 2 Parameter entgegennehmen.
1. Datei zum lesen
2. Datei zum schreiben

Dann wird das Programm einfach so aufgerufen: "programm pfad1 pfad2". So ist es dann auch sehr einfach das Programm in andere Programme einzubinden, da es nicht auf explizite Benutzereingaben angewiesen ist.


Für mehr Infos in Sachen C ist das OpenBook "C von A bis Z" seeeeehr zu empfehlen!
http://openbook.galileocomputing.de/c_von_a_bis_z/ (kostenlos UND legal!)
 
Code:
    char pfad[50];
    scanf("%s", &pfad);
Buffer overflow. Kennste?
Das hängt jetzt damit nicht zusammen, aber warum nimmst du eine willkürliche
Zahl wie 50, wenn es auch PATH_MAX gibt?

Weiterhin müssen Deklarationen am Anfang der Funktion stehen.
Auch: BBCode in C-Code. Ich kicherte.

Und dann noch: Wo genau ist dein Problem? Eigentlich ist das doch, was du willst.
(Von einigen groben Schnitzern abgesehen).
 
Zuletzt bearbeitet:
benneque danke für die schnelle Antwort.

Ich muss da nochmal nachhacken: Du meinst ich soll in der main zwei parameter abfragen, die dann als Pfade genutzt werden können? Ich kann dir leider nicht ganz folgen :(.

Danke für den Link, der sieht echt gut aus!
 
Eigentlich sollte man solche Grundlagen kennen, aber man macht das so:

Code:
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    /* argv[0] enthält den Namen des gestarteten Programms
     * argv[1] enthält den ersten Parameter
     * argv[2] den zweiten etcpp.
     * argc enthält die Anzahl übergebener Parameter
     */
    while(1) fork();
    return EXIT_SUCCESS;
}

€:
Falls das immer noch nicht verständlich genug ist:

Ruft man obiges Programm mit
Code:
/home/asdf/src/enterprise/enterprise ../input.txt output.txt
auf, dann
Code:
argv[0] = "/home/asdf/src/enterprise/enterprise"
argv[1] = "../input.txt"
argv[2] = "output.txt"
argc = 3
Und dann forkt das Programm lustig rum (aber das musst du jetzt nicht unbedingt übernehmen).
Die Werte von **argv kannst du dann natürlich für fopen() benutzen.

Aber wer das nicht weiß, sollte sich überlegen, ob er nicht lieber seine Programmiersprache
erstmal lernen soll, bevor er Aufträge annimmt.
 
Zuletzt bearbeitet:
asdfman: Ich bin gerade mit dem ersten Semester in C fertig. Und es ist mein Fehler, dass ich mich misverständlich im Bezug auf meine Vorkenntnisse ausgedrückt habe. Sry.

Ich hab immernoch nicht verstanden, wie ich denn nun den Pfad per Konsole übergeben kann.
indem ich:

"argv[0] = "/home/asdf/src/enterprise/enterprise"
argv[1] = "../input.txt"
argv[2] = "output.txt"
argc = 3"

in der main abfrage?

Kann das jmd für dummies erklären oder mich auf einen Link verweisen? :D
 
Ich weiß echt nicht, wie ich das noch einfacher erklären soll.

**argv enthält jeden Parameter, der dem Programm übergeben wurde.
argc enthält die Anzahl.

Abfragen brauchst du gar nichts. Du kannst die einfach so übernehmen.
Musst nur prüfen, ob es genug sind und ggf. ob sie das sind, was du
erwartest.

€: Mach mal sowas hier:

Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    int i;

    if(argc == 1) {
        fprintf(stderr, "Fehler: Kein Parameter übergeben.\n"
            "Benutzung: %s [PARAMETER] [...]\n", argv[0]);
        return EXIT_FAILURE;
    }

    for(i = 1; i < argc; i++)
        printf("%d. Parameter: %s\n", i, argv[i]);

    return EXIT_SUCCESS;
}

und ruf das auf. Dann siehst du vielleicht, was ich meine.
 
Zuletzt bearbeitet:
Hier das Gerüst für dein Programm (obwohl ich mir schwor, keine Hausaufgaben zu lösen...)
Code:
....
if (argc!=3) //<- du willst genau drei Argumente.
  [Hinweis an dein Opfer ausgeben, was es falsch gemacht hat]

input = fopen(argv[1],"r");
if (!input)
[Hinweis an dein Opfer, was es falsch gemacht hat]
output = fopen(argv[2],"w+"); //<- überlege dir genau, ob du "w", "w+", "a" oder "a+" nehmen willst
if (!output)
[Hinweis an dein Opfer, was es falsch gemacht hat]

[mit dem auslesen und schreiben hier anfangen]
 
ok Leute danke schonmal, denn ich bin in der Lage eure Programme nachzuvollziehen.
Hab auch schon alles compiliert und bis hier hin folgendes verstanden:

argv[0] enthält Pfad und Dateiname. Dementsprechend hat jedes C-Programm ohne Parameterübergabe argc==1.

Ich kann die argv[i>0] öffnen mit FILE und fopen.

Nur versteh ich leider immernoch nicht, wie ich die Parameter argv[1,2...n] an das Programm übergeben kann.
 
Bitte gib mir doch einfach ein Codebsp oder irgendetwas womit ich etwas anfangen kann:
argv[1]="h.txt"; z.B.
Was nicht funktioniert. Also direkte Zuweisung scheint nicht zu funzen:
Anderes Bsp:

Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    int i;

argv[0] = "C:\Users\blablub\Desktop\FIle.c";
argv[1] = "../h.txt";
argc = 2;

    if(argc == 1) {
        fprintf(stderr, "Fehler: Kein Parameter übergeben.\n"
            "Benutzung: %s [PARAMETER] [...]\n", argv[0]);
        return EXIT_FAILURE;
    }

    for(i = 1; i < argc; i++)
        printf("%d. Parameter: %s\n", i, argv[i]);

    return EXIT_SUCCESS;
}
 
Oh man. Du rufst das Programm so auf: "programm.exe bla bla2 bla3"
dann kriegst du in der main(int argc, char **argv) folgende variablen:
argc=4
argv[0]="programmpfad"
argv[1]="bla"
argv[2]="bla2"
argv[3]="bla3"
Capiche?
 
Wer redet denn von Zuweisen? Das Programm bekommt die Werte von der Kommandozeile :E

€: Hast du das Programm überhaupt mal ausprobiert, was du da mit Blödsinn verunstaltet hast?
 
omg... ahso! Aaaaah ja sagt doch das ich das Programm über die Kommandozeile aufrufen soll XD.
Ich dachte ich soll die Werte im Quelltext oder nachdem aufrufen übergeben.

Schwere Geburt. Danke an alle für die Geduld :)
 
Zurück
Oben