2012-04-11 18 views
0

Sehr neu in der C-Programmierung. Ich schreibe ein Programm, in dem ich den Benutzer auffordern soll, den Namen der Datei einzugeben, die zum Lesen geöffnet sein soll. Auf meinem unten gezeigten Code möchte ich einen Fehler werfen, wenn es nicht geöffnet wird oder wenn die Datei nicht existiert, aber wenn ich es ausführe, sprengt mein Code und ich muss das Programm schließen (DOS)C - Wie man den Benutzer zur Eingabe des Dateinamens auffordert

/*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 eine Datei namens name.txt erstellen. Bitte lassen Sie mich wissen, wenn Sie zusätzliche Informationen benötigen.

+6

Wie haben Sie 'fname' definiert? Oh, und bitte, bitte, bitte benutze 'gets' - niemals! Betrachten Sie 'fgets' als eine mögliche Alternative. –

+0

Sie sollten sich auch klar darüber sein, was Sie meinen, wenn Sie "wenn ich es ausführe" sagen, besonders wenn Sie neu bei C sind. Sie meinen, es kompiliert nicht, es stürzt sofort beim Ausführen ab, oder es stürzt ab, nachdem Sie es versucht haben einen Dateinamen eingeben und Enter drücken? – merlin2011

Antwort

0

Nicht sicher, was Sie vermissen, aber dieses Programm kompiliert und läuft für mich mit cl.exe in der Befehlszeile.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(){ 
    char fname[100]; 
    FILE* fp; 
    memset(fname, 0, 100); 
    /*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"); 
    } 

} 

Beachten Sie auch, dass bestimmte Compiler (einschließlich Microsoft) benötigen Sie alle Erklärungen an der Spitze der Funktion zu setzen, wenn sie mit Standardoptionen genannt.

3

Nun, sollten Sie sicherstellen, es gibt genug Platz in fname Ihre Dateinamen zu speichern, sonst werden Sie mit ziemlicher Sicherheit Korruption verursachen und „Sprengung“ :-)

Um zum Beispiel des folgenden Ausschnitts:

char fname[10]; 
gets (fname); 

wird problematisch, wenn Sie mehr Informationen eingeben als fname halten kann. An diesem Punkt sind Sie in undefinierten Verhaltensgebiet und alles kann passieren.

Aber, weil gets bietet keine Möglichkeit zu begrenzen, was der Benutzer eingibt, sollten Sie es nie verwenden!

Eine geeignete, geschützte Methode der Benutzereingabe finden Sie in this answer.

Es verwendet fgets, da das einschränken kann, was der Benutzer eingibt. Es ermöglicht auch eine Eingabeaufforderung, gibt eine Fehleranzeige aus, wenn etwas schief geht, behandelt das Dateiende korrekt und entfernt den Rest einer zu großen Zeile, so dass die nächste Eingabeoperation nicht beeinträchtigt wird.

In der Tat werde ich es hier kopieren diese Antwort in sich geschlossene zu machen:

#include <stdio.h> 
#include <string.h> 

#define OK  0 
#define NO_INPUT 1 
#define TOO_LONG 2 
static int getLine (char *prmpt, char *buff, size_t sz) { 
    int ch, extra; 

    // Get line with buffer overrun protection. 
    if (prmpt != NULL) { 
     printf ("%s", prmpt); 
     fflush (stdout); 
    } 
    if (fgets (buff, sz, stdin) == NULL) 
     return NO_INPUT; 

    // If it was too long, there'll be no newline. In that case, we flush 
    // to end of line so that excess doesn't affect the next call. 
    if (buff[strlen(buff)-1] != '\n') { 
     extra = 0; 
     while (((ch = getchar()) != '\n') && (ch != EOF)) 
      extra = 1; 
     return (extra == 1) ? TOO_LONG : OK; 
    } 

    // Otherwise remove newline and give string back to caller. 
    buff[strlen(buff)-1] = '\0'; 
    return OK; 
} 

Sie können es nennen wie folgt, den Puffer und Größe, die Angabe und eine Fehleranzeige auf Rückkehr empfangen:

+0

Kann ich einfach scanf benutzen? – NewLearner

+0

@NewLearner, gibt es andere Probleme mit 'scanf', besonders wenn Sie die 'unbounded string' Formatzeichenkette'% s' verwenden.Auch sie unterliegt einem Pufferüberlauf. 'scanf' bedeutet" scan formatiert "und es gibt nicht viel mehr _unformatted_ als Benutzereingaben :-) Versteht mich nicht falsch, es ist in den meisten Fällen in Ordnung, besonders für das Lernen von C, oder Klassenarbeiten oder schnell-und-schmutzigen Programmen, aber Es ist nicht gut für Produktionsqualitätscode. – paxdiablo

0

Nun, das ist, was passiert ist mit mir, Hinzufügen einer "sonst" Bedingung für "wenn" für mich gearbeitet.Below erwähnt ist der Code.

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 

int main() 
{ 

char fname[100]; 
FILE* fp; 
memset(fname, 0, 100); 
/*ask user for the name of the file*/ 
printf("enter file name: "); 
gets(fname); 

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"); 
} 

else 
{ 
    printf("hello"); 
} 


getch(); 
} 

Vergewissern Sie sich auch, dass Sie "#include" als Ihre Header-Datei hinzugefügt haben.

Verwandte Themen