2012-10-04 78 views
5

當我嘗試運行我的程序時,出現錯誤的行數。用於計算文件中行數的C函數

LINES: 0 

這是輸出雖然我在我的.txt文件五行

這裏是我的程序:

#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; 
} 

我相信這是一個簡單的錯誤,但我是新來的節目。任何幫助將不勝感激。

+0

你應該給,總結錯誤,沒有什麼,當你得到你做一個標題錯誤。 – Nobody

+3

比較一個'char'和'EOF'是否有問題。 –

+0

爲什麼,@CarlNorum? – corazza

回答

4

您聲明

int countlines(char *filename) 

採取char *說法。

你這樣稱呼它

countlines(fp) 

傳遞一個FILE *。

這就是你得到那個編譯錯誤的原因。

你或許應該,因爲你在了countLines

您當前的代碼試圖在兩個不同的地方打開文件打開文件第二行改爲

countlines("Test.txt") 

+0

我犯了一個錯誤,主要應該用文件的名稱取一個參數值。該程序編譯,但我得到一個段錯誤(核心轉儲)錯誤。 –

+2

你應該接受一個解答你的原始問題的答案,而不是完全改變問題,並提出一個新問題。 –

2

你打開一個文件,然後將該文件指針傳遞到只想要一個文件名,打開文件本身的功能。你可以簡化你的電話;

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

編輯:你改變了問題,所以它很難回答;起初你把你的更改改成main()錯了,你忘了第一個參數是argc,所以它崩潰了。現在你有問題了;

if (fp == NULL); // <-- note the extra semicolon that is the only thing 
        //  that runs conditionally on the if 
    return 0;  // Always runs and returns 0 

這將始終返回0.刪除多餘的分號,你應該得到一個合理的計數。

+0

我更改了代碼以獲取參數值,即文本的名稱。我現在運行程序時出現錯誤段錯誤(核心轉儲)。 –

+0

@ Michael_19那麼'main'並不是那樣真正地採用這種方式。嘗試'int main(int argc,char * argv [])' –

+0

@ Michael_19好吧,最後一次嘗試回答,但你不斷改變你的問題,所以現有的答案不再適用,答案越來越少給他人。如果您還有其他問題,請接受可以幫助您的答案,並針對您的新問題提出一個新問題。 –

0

我看不出有什麼,什麼會導致分割故障立即明顯。我唯一的懷疑是,當你運行代碼時,你的代碼希望得到一個文件名作爲參數,但是如果你沒有通過它,它會試圖引用一個參數。

當它不存在時訪問argv[1]導致分段錯誤。 在嘗試引用它們之前檢查參數的數量通常是很好的做法。您可以通過使用main()的以下函數原型並檢查argc是否大於1(簡單地說,它將指示argv中的數字條目)來完成此操作。

int main(int argc, char** argv) 

弄清楚是什麼原因導致段錯誤一般的最佳方法是使用調試器。如果您使用的是Visual Studio,請在主功能頂部放置一個斷點,然後選擇在調試時運行,而不是在啓動程序時運行「無需調試」。它會停止頂部的執行,並讓你一行一行,直到你看到一個問題。

如果你在Linux中,你可以抓住核心文件(它的名字中會有「核心」)並用gdb(GNU Debugger)加載。它可以給你一個堆棧轉儲,它會直接指向導致分段故障發生的線路。

編輯:我看到你改變了你的問題和代碼。所以這個答案可能不再有用,但是我會留下它,因爲無論如何它都是很好的建議,並且看看我是否可以在短期內解決修改過的問題)。

1

你有一個;在if的末尾。 變化:

if (fp == NULL); 
    return 0; 

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

這是** if if without {}是個壞主意的原因之一。 – Lundin

0

這裏是我的功能

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

}