C - Wie der Benutzer aufgefordert, Dateiname eingeben
Sehr neu in der C-Programmierung. Ich Schreibe ein Programm, wo ich will, fordert den Benutzer zur Eingabe der Namen der Datei, die zum Lesen geöffnet. Auf meinem code (siehe unten) ich will keinen Fehler werfen, wenn Sie nicht offen ist oder wenn die Datei nicht existiert, aber wenn ich es starten, mein code explodiert, und ich muss das Programm schließen (DOS)
/*ask user for the name of the file*/
printf("enter file name: ");
gets(fname);
//Opens the file from where the text will be read.
fp=fopen(fname, "r");
//Checks if the file us unable to be opened, then it shows the error message
if (fp == NULL)
{
printf("\nError, Unable to open the file for reading\n");
}
//Sie können dies testen, indem Sie die Schaffung eines name.txt Datei. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.
- Wie haben Sie
fname
? Oh, und bitte, bitte, bitte nicht verwendengets
- niemals! Betrachtenfgets
als eine mögliche alternative. - Sie sollten sich auch darüber im klaren sein, was Sie meinen, wenn Sie sagen, "wenn ich es laufen", vor allem, wenn Sie neu sind C. meinst du es nicht kompilieren, stürzt es ab sofort auf laufen, oder es stürzt ab, nachdem Sie versuchen, geben Sie einen Dateinamen ein und drücken Sie enter,?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, Sie sollten stellen Sie sicher, es gibt genug Platz in
fname
zum speichern Ihrer Datei-Namen, sonst werden Sie fast sicher die Ursache der Korruption und der "Sprengung" 🙂Beispielsweise den folgenden Codeausschnitt:
wird dann problematisch, wenn Sie weitere Informationen eingeben als
fname
halten kann. An diesem Punkt, Sie sind in ein Undefiniertes Verhalten Hoheitsgebiet und alles passieren kann.Aber, weil
gets
keine Möglichkeit bietet, zu beschränken, was der Benutzer eingibt, sollten Sie nie verwenden!Ordnungsgemäße, geschützt, Methode der Benutzereingaben kann gefunden werden in diese Antwort.
Es nutzt
fgets
da das kann zu begrenzen, was der Benutzer eingibt. Es ermöglicht auch eine Aufforderung, liefert ein Fehlerbild, wenn etwas schief geht, behandelt das Ende der Datei korrekt ist, und entfernt den Rest von zu großen Linie, so dass es keinen Einfluss auf die nächste Eingabe.In der Tat, ich werde es kopieren, hier zu machen, diese Antwort selbst zu enthalten:
Sie können es nennen, wie folgt, mit Angabe der Puffer und die Größe, und erhalten eine Fehleranzeige bei der Rückkehr:
scanf
- besonders, wenn Sie verwenden die 'unbounded string' format-string%s
. Es ist auch Thema, um buffer-overflow.scanf
bedeutet "scan formatted" und da ist nicht viel mehr unformatiert als user input 🙂 versteh mich nicht falsch, es ist gut, in den meisten Fällen, vor allem für das lernen C, oder Unterricht, oder auch quick-und-dirty-Programme, aber es ist nicht gut für die Produktion von hochwertigem code.Nicht wissen, was Sie fehlen, aber das Programm kompiliert und läuft bei mir mit cl.exe in der Befehlszeile.
Beachten Sie auch, dass bestimmte Compiler (einschließlich Microsoft) benötigen Sie, um alle Deklarationen an den Anfang der Funktion beim Aufruf mit default-Optionen.
gut,Das ist, was passiert mit mir, indem eine "else" Bedingung "wenn" für mich gearbeitet.Unten erwähnt ist der code.
Stellen Sie außerdem sicher, dass Sie Hinzugefügt haben, wird "#include" als header-Datei.