[gelöst] ausführbare.exe parameter --> datei1=fopen("argv[1]","r");
-
Moin Leute,
ich vesuche in einem Programm eine Datei einzulesen, deren Name ich als Parameter beim Programmaufruf übernommen habe. Aber es will nicht so recht...
Den Start mache ich mit:
int main(int argc, char *argv[])
Damit übernimmt er die Paramter. Nun kann ich schon sowas wie "/?" als Parameter ausweren, das mache ich so:
if((strcmp(argv[1],"/?") == 0){Anweisungen}
Soweit so gut. Aber mit:
FILE *datei1; datei1=fopen("argv[1]","r");
wollte ich eine Datei einlesen, die den Dateinamen hat, der mit dem zweiten argv[] übereinstimmt. Das will er aber nicht, denn beim compilieren (mit Bloodshev DEV-C++ 4.9.9.2) gibt´s ´ne Warnung:" 42 [...] auswert.c [Warning] assignment makes integer from pointer without a cast". Ich bin zwar durchaus in der Lage eine Konversation auf Englisch zu führen aber englisches (jedenfalls für mich) Fachchinesisch ist mir zu dick...
Beim Ausführen passiert´s dann: "auswert.exe hat ein Problem festgestellt und muss beendet werden."
Setze ich statt des "argv[1] einfach gleich den Dateinamen der (natürlich vorhanden) Datei ein, so liest sie anstandslos ein.Ich brauche euren Rat, wie bringe ich ihm bei, den ersten Parameter als Dateinamen einer zu öffnenden Datei zu verstehen?
Ach so:; der Header sieht m Moment noch so aus:
#include <stdio.h> #include <stdlib.h> #include <string.h>
thx
Christian
-
datei1=fopen("argv[1]","r");
lass doch mal die anfuehrungszeichen weg... ist ja schliesslich ne variable
-
Das kann ich zwar machen, es ändert aber leider nichts an allen(!) anderen Tatsachen. Nee, leider nicht, gleiche warnung beim Compilieren und gleicher Absturz im Programm... Danke trotzdem!
CP
-
dann poste doch mal den komletten quellcode...
-
OK, es wird eigentlich so nicht gewünscht aber dann will ich mal...
// Erfassungs- und Auswertungsprogramm von Lottoscheinen #include <stdio.h> #include <stdlib.h> // für atoi #include <string.h> // für strcmp int main(int argc, char *argv[]) { int i=0; int statistik=1; int c=0; char para1=0; char para2=0; printf("\n argc = %d \n", argc); if (argc > 1) { if((strcmp(argv[1],"?") == 0) || (strcmp(argv[1],"/?") == 0) || (strcmp(argv[1],"/h") == 0) || (strcmp(argv[1],"/H") == 0)) printf("\n Hilfetext\n\n"); for (i=1; i<argc; i++) { {if((strcmp(argv[i],"/NS") == 0) || (strcmp(argv[i],"/ns") == 0) || (strcmp(argv[i],"/nS") == 0) || (strcmp(argv[i],"/Ns") == 0)) statistik=0; } } } printf("\n Variable \"statistik\" auf %d gesetzt.\n", statistik); // Anzeige aller eingegebenen Parameter incl. Dateiname: { for(i=0; i<argc; i++) { printf("argv[%d] = %s ",i,argv[i]); printf("\n"); } } //Routine zum zeichenweisen Auslesen einer Datei if (argc > 1) { para1 = &argv[1]; printf("™ffne im ersten Parameter angegebene Datei...\n\n"); FILE *datei1, *datei2; datei1=fopen(argv[1],"r"); if(datei1==NULL) { printf("Konnte Datei \"%s\" nicht öffnen!\n", para1); } } return 0; }
-
Das Problem liegt meiner Meinung nach beim strcmp. Selbe Warnung bzw. Fehler beim Ausführen kenne ich auch, wenn ich einen Parameter mit einem String vergleichen will. Wenn jemand 'ne Lösung kennt würd ich mich auch sehr freuen.
-
char para1=0;
char para2=0;muessen pointer sein, um
para1 = &argv[1];
darauf zeigen zu koennen
also:
char *para1; para1 = &argv[1];
-
Das Problem liegt meiner Meinung nach beim strcmp. Selbe Warnung bzw. Fehler beim Ausführen kenne ich auch, wenn ich einen Parameter mit einem String vergleichen will. Wenn jemand 'ne Lösung kennt würd ich mich auch sehr freuen.
aehm, das ist doch totaler mist...
-
Totaler Mist? Mag sein, ich beschreibe nur was ich sehe. Mag ein gcc-spezifisches Problem sein... Hab dafür grad folgende Lösung gefunden:
strcmp((char *)argv[1],"?");
Das funktioniert...
-
du hast also eine loesung fuer ein nicht existierendes problem gefunden... cool
ich hab die loesung doch schon gepostet
und was du da schreibst ist wirklich totaler mist, warum sollte man chars zu chars casten??
-
so...
@moh:char *para1; para1 = &argv[1];
habe ich mal so eingebaut. Diesmal bringt´s mit die Warnung: "42 [...] auswert.c [Warning] assignment from incompatible pointer type" Das Programm bricht aber immerhin nicht mehr ab. Jedoch bekomme ich die Meldung von meinem Prog die Fehlermeldung, dass er die Datei nicht öffnen konnte. Er hat sie wohl nicht eingelesen, denn ich habe einen Text in die Datei gepackt.
Interessant dabei ist aber folgendes: Ich rufe das Programm mit "auswert test.txt" auf und als Fehler meldung gibt es "Konnte Datei "F$=" nicht ÷ffnen!" zurück. Mir scheint, das bringt uns nicht wirklich weiter...@Niklas Cathor:
Ich kann im Moment auch keinen Zusammenhang zwischen der "Vergeichszeile" oben im Programm und meinem Problem unten beim Dateiaufruf sehen. Kannst du das bitte mal genauer erläutern? Was ändert dieses oben eingefügte "(char *)" bei dem Versuch weiter unten eine Datei zu öffnen?[edit] DOCH, jetzt raffe ich´s: Du hast Recht, hast nur eine leicht verwirrende Antwort gegeben.
strcmp((char *)argv[1],"?");
Mit der Zeile
datei1=fopen((char *)argv[1],"r");
macht er was ich will, nämlich die Datei öffnen, deren Name ich als ersten Parameter an das Programm übergebe.
Danke für eure Hilfe!
thx
Christian
-
Nein, ich kann dir leider nicht erklären, warum das so ist... Ich hab's auch nur durch rumprobieren rausgefunden... Das erklärt auch, warum mein Beitrag scheinbar verwirrend war... egal... Hauptsache es funzt bei dir!
-
wenn du einen (char) pointer auf den anfangsbereich eines statischen (char) arrays zeigen laesst, musst du natuerlich auch genug speicher zur verfuegung haben...
wenn du auch nur einen funken ahnung haettest wuerdest du wenigstens mal drauf kommen char **para1 oder char *para1[100] zu probieren.
und sonst benutz strcpy();
Nein, ich kann dir leider nicht erklären, warum das so ist... Ich hab's auch nur durch rumprobieren rausgefunden... Das erklärt auch, warum mein Beitrag scheinbar verwirrend war... egal... Hauptsache es funzt bei dir!
soetwas kann man doch kein programmieren nennen
Warnung: "42 [...] auswert.c [Warning] assignment from incompatible pointer type
ich glaube du hast noch nicht einmal in deine zeile 42 geschaut, oder?
dann wuerdest du auch sehen, dass du den fehler an ganz falscher stelle suchst.und warum brauchst du para1 als variable ueberhaupt???
nimm doch gleich argv[1]...
-
// Erfassungs- und Auswertungsprogramm von Lottoscheinen #include <stdio.h> #include <stdlib.h> // für atoi #include <string.h> // für strcmp int main(int argc, char *argv[]) { int i=0; int statistik=1; int c=0; char *para1=0; char *para2=0; printf("\n argc = %d \n", argc); if (argc > 1) { if((strcmp(argv[1],"?") == 0) || (strcmp(argv[1],"/?") == 0) || (strcmp(argv[1],"/h") == 0) || (strcmp(argv[1],"/H") == 0)) printf("\n Hilfetext\n\n"); for (i=1; i<argc; i++) { if((strcmp(argv[i],"/NS") == 0) || (strcmp(argv[i],"/ns") == 0) || (strcmp(argv[i],"/nS") == 0) || (strcmp(argv[i],"/Ns") == 0)) statistik=0; } } printf("\n Variable \"statistik\" auf %d gesetzt.\n", statistik); // Anzeige aller eingegebenen Parameter incl. Dateiname: for(i=0; i<argc; i++) printf(" argv[%d] = %s\n",i,argv[i]); //Routine zum zeichenweisen Auslesen einer Datei if (argc > 1) { para1 = argv[1]; // Warum schreibst du bei fprintf statt para1 nicht gleich argv[1] hin? printf(" Oeffne im ersten Parameter angegebene Datei...\n\n"); FILE *datei1, *datei2; datei1=fopen(argv[1],"r"); if(datei1==NULL) fprintf(stderr, "Konnte Datei \"%s\" nicht öffnen!\n", para1); } return 0; }
Deine Klammerung ist, naja, extravagant...
-
Achja, nimm strcasecmp für deine Vergleiche! Die Funktion ignoriert Groß- und Kleinschreibung.
-
oehm, hab ich doch geschrieben...