2012-10-04 7 views
5

Wenn ich versuche, mein Programm auszuführen, bekomme ich die falsche Anzahl von Zeilen gedruckt.C-Funktion, die Zeilen in Datei zählt

LINES: 0 

Dies ist die Ausgabe obwohl ich in meiner .txt-Datei

Hier mein Programm fünf Linien haben, ist:

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

int countlines(char *filename); 

void main(int argc, char *argv[]) 
{ 
    printf("LINES: %d\n",countlines(argv[1]));   
} 


int countlines(char *filename) 
{ 
    // count the number of lines in the file called filename          
    FILE *fp = fopen(filename,"r"); 
    int ch=0; 
    int lines=0; 

    if (fp == NULL); 
    return 0; 

    lines++; 
    while ((ch = fgetc(fp)) != EOF) 
    { 
     if (ch == '\n') 
    lines++; 
    } 
    fclose(fp); 
    return lines; 
} 

Ich bin sicher, dass es ein einfacher Fehler ist, aber ich bin neu auf Programmierung. Jede Hilfe würde sehr geschätzt werden.

+0

Sie sollten einen Titel geben, die den Fehler zusammenfasst, nicht das, was Sie tun, wenn Sie bekommen der Fehler. – Nobody

+3

Vergleicht man ein 'char' mit' EOF', wird nach Problemen gefragt. –

+0

Warum, @CarlNorum? – corazza

Antwort

4

Sie erklären

int countlines(char *filename) 

ein char * Argument zu nehmen.

Sie nennen es wie dieses

countlines(fp) 

* in einer Datei übergeben.

Deshalb erhalten Sie diesen Kompilierungsfehler.

Sie sollten wahrscheinlich, dass die zweite Zeile zu

ändern
countlines("Test.txt") 

, da Sie die Datei in öffnen countlines

Ihre aktuellen Code die Datei an zwei verschiedenen Orten zu öffnen versucht.

+0

Ich habe einen Fehler gemacht, Main soll einen Argumentwert mit dem Namen der Datei aufnehmen. Das Programm kompiliert, aber ich bekomme einen Segmentfehler (core dumped) -Fehler. –

+2

Sie sollten eine Antwort akzeptieren, die Ihre ursprüngliche Frage behandelt, anstatt die Frage vollständig zu ändern und eine neue Frage zu stellen. –

2

Sie öffnen eine Datei und übergeben den Dateizeiger dann an eine Funktion, die nur einen Dateinamen zum Öffnen der Datei benötigt. Sie können Ihren Anruf vereinfachen;

void main(void) 
{ 
    printf("LINES: %d\n",countlines("Test.txt")); 
} 

EDIT: Sie ändern die Frage um, so ist es sehr schwer zu beantworten; Zuerst hast du deine Änderung an main() falsch gemacht, du hast vergessen, dass der erste Parameter argc ist, also ist er abgestürzt. Jetzt hast du das Problem von;

die immer 0 zurückgeben. Entfernen Sie das zusätzliche Semikolon, und Sie sollten eine angemessene Anzahl erhalten.

+0

Ich habe den Code geändert, um einen Argumentwert zu verwenden, der den Namen des Textes darstellt. Ich bekomme den Fehler Segment Fehler (Core Dumped), wenn ich das Programm jetzt ausführen. –

+0

@ Michael_19 Nun, 'Main' nimmt die Argumente nicht wirklich so. Versuchen Sie 'int main (int argc, char * argv [])' –

+0

@ Michael_19 OK, ein letzter Versuch zu beantworten, aber Sie ändern Ihre Frage, so dass die vorhandenen Antworten nicht mehr gelten, und die Antworten werden immer weniger nützlich zu anderen. Wenn Sie weitere Fragen haben, akzeptieren Sie bitte eine Antwort, die Ihnen hilft und eine neue Frage mit Ihrem neuen Problem stellt. –

0

Ich sehe nichts sofort offensichtlich, was einen Segmentierungsfehler verursachen würde. Mein einziger Verdacht ist, dass Ihr Code erwartet, dass Sie einen Dateinamen als Parameter erhalten, wenn Sie ihn ausführen, aber wenn Sie ihn nicht übergeben, wird er trotzdem versuchen, einen zu referenzieren.

Zugriff auf argv[1], wenn es nicht existiert würde einen Segmentierungsfehler verursachen. Es empfiehlt sich in der Regel, die Anzahl der Argumente zu überprüfen, bevor Sie versuchen, sie zu referenzieren. Sie können dies tun, indem Sie den folgenden Funktionsprototyp für main() verwenden und überprüfen, dass argc größer als 1 ist (es wird einfach die Anzahl der Einträge in argv anzeigen).

int main(int argc, char** argv) 

Der beste Weg, um herauszufinden, was eine segfault im Allgemeinen verursacht, ist ein Debugger zu verwenden. Wenn Sie in Visual Studio sind, legen Sie einen Haltepunkt oben in der Hauptfunktion und wählen Sie Führen Sie mit dem Debuggen anstelle von "Ausführen ohne Debuggen" aus, wenn Sie das Programm starten. Es stoppt die Ausführung oben und lässt Sie Zeile für Zeile weiterlaufen, bis Sie ein Problem sehen.

Wenn Sie in Linux sind, können Sie einfach die Kerndatei (es wird "Kern" im Namen haben) und laden Sie diese mit gdb (GNU Debugger). Es kann Ihnen einen Stapelspeicherabzug geben, der Sie direkt zu der Zeile führt, die den Segmentierungsfehler verursacht hat.

EDIT: Ich sehe, Sie haben Ihre Frage und Code geändert. Also diese Antwort ist wahrscheinlich nicht mehr nützlich, aber ich werde es verlassen, da es sowieso ein guter Rat ist, und sehen, ob ich die modifizierte Frage (kurz) ansprechen kann.

1

Sie haben eine; am Ende der if. Wechsel:

if (fp == NULL); 
    return 0; 

zu

if (fp == NULL) 
    return 0; 
+2

Dies ist einer der vielen Gründe warum ** if ** ohne {} eine schlechte Idee ist. – Lundin

0

Hier ist meine Funktion

char *fileName = "input-1.txt"; 
countOfLinesFromFile(fileName); 

void countOfLinesFromFile(char *filename){ 
FILE* myfile = fopen(filename, "r"); 
int ch, number_of_lines = 0; 
do 
{ 
    ch = fgetc(myfile); 
    if(ch == '\n') 
     number_of_lines++; 
} 
while (ch != EOF); 
if(ch != '\n' && number_of_lines != 0) 
    number_of_lines++; 
fclose(myfile); 
printf("number of lines in %s = %d",filename, number_of_lines); 

}

Verwandte Themen