2011-06-12 77 views
0

我是C語言和編程的新手。我想寫一個C程序,它將讀取文本文件的內容並將其打印到控制檯。我有一個名爲test.txt的文本文件,其中包含字符串「Hi」。我創建了一個C程序用下面的代碼:另一個關於從初學者開始在C中打開的問題

#include <stdio.h> 

main() 
{ 
    FILE *myfile; 
    myfile=fopen("test.txt", "r"); 
    printf("%s", myfile); 
    fclose(myfile); 
} 

這個程序編譯OK(至少使用默認設置),但是當我運行該程序,字符串「嗨」不會出現。你能幫我看看我做錯了什麼嗎?謝謝。

另外,你有任何C參考網站,你會推薦?我正在尋找一個包含C語言規範的網站,可能包括如何使用庫函數的示例。

非常感謝您的時間。

安德魯

卡內基 - 梅隆大學

回答

0

問題是,您正在嘗試打印FILE指針而不是文件的內容 - 您需要一個變量來存儲它。

看到其他方法很有意思。這裏是fscanf()函數的實現 -

#include <stdio.h> 
#define FILENAME "test.txt" 

int main(void) 
{ 
    FILE *myfile; 
    char string[81] = {'\0'}; 

    myfile=fopen(FILENAME , "r"); 
    if(myfile == NULL) 
    { 
     printf("The file test.txt could not be found! Exiting...\n"); 
     return -1; 
    } 
    while(fscanf(myfile, " %80[^\n]s", string) != EOF) 
    { 
     printf("%s\n", string); 
    } 
    fclose(myfile); 

    return 0; 
} 

當你打開一個文件,如果操作失敗,將返回NULL,這是很好的做法,明確檢查這讓你知道什麼出了錯。 fscanf()返回成功讀取的次數(在此爲1,轉換爲字符串時爲1),如果已達到文件末尾,則返回EOF。格式字符串首先使用空格刪除輸入流中的所有前面的空格(換行符,空格,製表符)。

在scanf()函數中使用字段寬度說明符(80)意味着只有很多字符會被讀取,所以輸入不能超過分配的空間 - 非常有用!

[^]表示流只會被讀取直到遇到指定的字符。 [^ \ n]是一種獲取字符串空白的方式,因爲scanf()系列通常只會讀取字符串空白。請注意,換行符不會被刪除(它仍然是流中的第一個)。

然後打印字符串,並添加一個換行符。該程序將遍歷多達80行的文字(由換行符分隔)。如果你想保留這些行,你可以使字符串成爲char數組的數組,並且每次都增加。這是fscanf()格式字符串中的第一個空格派上用場的地方,它將刪除仍在流開頭的換行符(以及任何其他前面的空格)。

我還沒有找到任何學習C在線的權威教程,但有很多可用的。目前的標準是不是初學者友好的,但一個草案形式是免費提供:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

另一個很好的資源(但不是教程)是http://c-faq.com/

的標準庫函數,我底細的最好的參考資料我發現是Harbison & Steele的C:參考手冊 - 但不幸的是它不是免費的。

4

您正在嘗試在該位置打印字符串由myfile到控制檯的價值指向。這顯然是不正確的(如果你不知道爲什麼,這是因爲%s期望char*,而不是FILE*,並且FILE*不指向該文件的內容)。

從文件中讀取數據,使用fread

char buf[80] = {0}; // fill buf with NULLs 
fread(buf, sizeof(char), 2, myfile); // read 2 bytes 

如果您想將整個文件讀入緩衝區,事情變得稍微有點複雜,因爲你必須確定該文件的長度和然後在合適大小的堆上動態分配內存以保存該文件。 the fread page at cplusplus.com有一個很好的教程。

+0

根據定義,'sizeof(char)'是1。 – 2011-06-12 20:03:12

+0

@Jon是的,你說得對,謝謝。 – 2011-06-12 20:06:17

1

這是因爲你沒有讀取文件。要讀取一個文件,你可以使用的方法freadfgets

1

讀取一行,它會更有意義使用fgets因爲它讀取多達線路終端(\n)。

char line[256] 
fgets(line, sizeof(line), file); 
printf("%s", line); 
1

這是最安全的方法。

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

main() 
{ 
    FILE *myfile; 
    char buf[80]; 
    myfile=fopen("test.txt", "r"); 
    while(!feof(myfile)){ 
    memset(buf, 0, 80); 
    fread(buf, sizeof(char), sizeof(char)*79, myfile); 
    printf("%s", buf); 
    } 
    fclose(myfile); 
} 

feof檢查以確保沒有達到文件末尾。 memset,將緩衝區中的所有內容都設置爲0. fread將從文件讀取多達79個字符到緩衝區中。請注意,最大大小應該是79而不是80,即緩衝區的大小。這是因爲數組中的最後一個點應該保留爲空字符'\ 0',這表示C已經結束了字符串。請使用fgets。此函數被認爲是不安全的,因爲它可能導致緩衝區溢出,其中字符被寫入超過爲字符串分配的內存空間。

如果您對編程一般都不熟悉,我會建議在學習C之前學習像Python這樣的更適合初學者的語言。對於新程序員來說,C被認爲是棘手的,因爲它沒有自動內存管理,面向對象編程功能或大型標準庫。