Vollständige Version anzeigen : Kommandoparameterübergabe an fopen in C


s1nu
06.03.2014, 21:35

Hallo Jungs und Mädels,

ich brauch mal bitte eure Hilfe.. also ich möchte ein Programm schreiben, dass per Kommandozeile in Linux einen Operator und 2 Files einliest.. sprich der Befehl lautet: ;/WordCount File1;txt File2;txt

Wie übergebe ich denn die beiden char *argv[] elemente, sodass ich diese direkt in fopen ("testdatei;txt", "r") verwenden kann?

Würde ja zB;: fopen(argv[1], "r"); nehmen, aber das klappt so nicht. Bin etwas verwundert, weil ich mit printf("%s",argv[1]); den ersten Parameter ausgeben kann, also warum kann ich den String dann nicht so einsetzen xD

Hoffe jemand versteht was ich meine und kann mir helfen. So ganz allgemein würde meine Funktion so aussehen..

Pseudocode:

File *datei;
int i, cnt = 0;
for(i = 1; i < argc; i++){
datei = fopen(argv[i], "r"); // so würd ich gern, klappt aber nich^^
char c;
while((c=fgetc(datei)) != EOF){
cnt++;
}
fclose(datei);
}



Nur vom Gedanken her.. sollte das Programm beide dateien oder halt je nachdem wieviele dateien man angibt diese nacheinander öffnen und die Bytes oder Zeichen zählen..

Würde mich freuen, wenn mir jemand helfen könnte, Danke schonmal

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
xXsoureXx
07.03.2014, 01:04

Hi.

Da printf dir den richtigen String ausgibt, denke ich dein Problem liegt eher in der fopen Funktion.
fopen liefert NULL, wenn es die Datei nicht öffnen kann. Hast du die angegebene Datei auch sicher im richtigen Verzeichnis liegen, so dass dein Programm diese finden kann? Und hast du die passenden Rechte diese zu öffnen?
Überprüf ruhig mal "if fopen(.;) == NULL"


if(argc > 1)
{
if(f = fopen(argv[1], "r") == NULL)
printf("%s konnte nicht geoeffnet werden\n", argv[1]);
else
printf("%s geoeffnet", argv[1]);
}


Das funktioniert bei mir problemlos (windows, MinGW).


MasterJulian
07.03.2014, 07:21

Dein Code enthält ein paar logische Fehler:
File *datei; //muss heißen FILE, da müsste eigentlich der Compiler meckern
int i, i < argc-1, cnt = 0; //Was soll das für eine Variablendeklaration sein?
for(i = 0; i < anz; i++){ //argv[0] ist immer der Programmaufruf. argv[1] der erste Parameter! Zudem wurde anz nirgends definiert
datei = fopen(argv[i], "r"); // so würd ich gern, klappt aber nich^^
char c;
while((c=fgetc(datei)) != EOF){
cnt++;
}
fclose(datei);
}


evtl hilft das: The GNU C Programming Tutorial (;crasseux~com/books/ctutorial/argc-and-argv;html)

PS: Bytes lassen sich wohl mit fseek und ftell effizienter zählen. Siehe: ftell - C++ Reference (;;;cplusplus~com/reference/cstdio/ftell/)


s1nu
07.03.2014, 08:12

danke schonmal für eure rückmeldung.. julian es handelt sich dabei um pseudocode ;) das es FILE heißt, ist mir bewusst, hab nur beim reintippen nicht aufgepasst. Zudem stellt das nur einen teil des gesamten codes dar. argc-1 ist doch praktisch, da hab ich gleich die anzahl der gegebenen parameter abzüglich des programmnamens.. wenn ich also 2 files als parameter übergebe, dann nimmt er zuerst das argv[1] liest das aus und dann das argv[2]? So zumindestens die Idee^^ aber ich merk grad, ich hab das falsch reingeschrieben.. hab das nochmal editiert^^

kannst du mir allgemein erklären, wie man das am besten umsetzt? müsste ja gehen oder, dass ich die argumente an fopen übergebe oder halt an fseek wie auch immer, oder nich?

;source: joa das geht so bei mir auch, nur lässt sich das argv nicht an die fopen übergeben iwie :/


Kolazomai
07.03.2014, 09:16

Hallo!

Was heisst denn "es klappt nicht"? Compiler-Fehler? FILE-Pointer wird NULL?

#include <stdio;h>
#include <stdlib;h>

int main (int argc, char **argv)
{
FILE *files[(argc - 1)];
int i = 0;

for (i = 1; i < argc; i++)
{
files[i] = fopen(argv[i], "r");

if (files[i] == NULL)
{
printf("Could not open %s;\n", argv[i]);
} else {
printf("%s opened;\n", argv[i]);
fclose(files[i]);
}
}

return EXIT_SUCCESS;
}


files;exe exec;bat files;c notexists;file
exec;bat opened.
files;c opened.
Could not open notexists;file;


Mfg,

Kolazomai


MasterJulian
07.03.2014, 09:23

Da ich an meinem freien Freitag gearde nichts bessers zu tun hab:
#include <stdio;h>

int main (int argc, char *argv[])
{
FILE *pFile;
int nCount = 0, i;

if(argc < 2)
{
printf("Usage: %s file1 ... fileN\n", argv[0]);
return -1;
}

for(i = 1; i < argc; i++)
{
pFile = fopen(argv[i], "rb");
if(pFile == NULL)
{
printf("Unable to open file \"%s\"\n", argv[i]);
return -1;
}
fseek(pFile,0, SEEK_END);
nCount += ftell(pFile);
fclose(pFile);
}
printf("Read %i Bytes\n", nCount);
return 0;
}

Allerdings nur unter Windows mit msvc getestet.

//edit: nCount muss natürlich je nach Anwendung groß genug gewählt werden. Ist aber nur ein (funktionierendes) Beispiel.


s1nu
07.03.2014, 19:10

Danke an alle, so hats geklappt :D Hab beide Codes getestet und waren beide erfolgreich.


Ähnliche Themen zu Kommandoparameterübergabe an fopen in C
  • Testaufgabe in C: fopen Fehler finden
    Hey Leute kann mir vllt jemand bei dem Blatt hier helfen? Vorallem die Lösung der letzten Aufgabe wäre gut :thumbsup: Danke!!! [...]

  • [PHP] Webrequest mit fopen endet mittendrin
    Hey, vielleicht ist der Titel ein wenig verwirrend. Jedenfalls hab ich folgende Situation: Ein HTTP Server läuft im Netzwerk und liefert über bestimmte URLs verschiedene Daten als xml oder JSON. Nun rufe ich mit PHP eine dieser URLs auf, um die Daten zu bekommen. Dafür benutze ich zur Zeit diese [...]

  • Problem mit fopen
    Hallo ihr! ich hab ein Problem mit einem uploadscript.. es sollen Bilder, auf meinen Server gezogen werden, indem man die komplette URL des Bildes eingibt das html-formular hat n ganz normalen input type="text" namens URL und hat 100%ig keinen fehler der PHP-teil sieht so aus $data [...]



raid-rush.ws | Imprint & Contact pr