2016-12-02 68 views
0

我發現這段代碼在Reading a file character by character in C,它編譯並且是我想要使用的。我的問題是我無法獲得正確的呼叫。代碼如下:無法打電話工作

char *readFile(char *fileName) 
{ 
    FILE *file = fopen(fileName, "r"); 
    char *code; 
    size_t n = 0; 
    int c; 

    if (file == NULL) 
     return NULL; //could not open file 
    code = malloc(1500); 

    while ((c = fgetc(file)) != EOF) 
    { 
     code[n++] = (char) c; 
    } 
    code[n] = '\0'; 

    return code; 
} 

我不確定如何調用它。目前我使用下面的代碼來調用它: .....

char * rly1f[1500]; 
char * RLY1F; // This is the Input File Name 
rly1f[0] = readFile(RLY1F); 
if (rly1f[0] == NULL) { 
    printf ("NULL array); exit; 
} 
int n = 0; 
while (n++ < 1000) { 
    printf ("%c", rly1f[n]); 
} 
..... 

如何調用ReadFile函數,使得我有一個數組(rly1f),這是不爲空?文件RLY1F存在並且包含數據。我已經成功地打開它以前使用'在線代碼'不是一個函數。 謝謝

+2

'printf(「NULL array」; exit;'could not compile。 – Downvoter

+1

當前'RLY1F'沒有做任何事情,它只是一個空的'char *'指針,你需要爲它指定文本文件的名字。像'char * RLY1F =「myfile.txt」;' – RoadRunner

+1

注意''rly1f'是一個'char' **指針**的數組,所以'printf(「%c」,rly1f [n]);'是未定義,因爲您的格式說明符不匹配。當然是 – Downvoter

回答

1

您遇到的錯誤是您忘記傳遞有效的文件名。因此,無論程序崩潰,或fopen試圖打開一個丟棄的名字,並返回NULL

char * RLY1F; // This is not initialized! 
RLY1F = "my_file.txt"; // initialize it! 

你必須將你的循環打印字符的下一個問題。

您已定義指針char * rly1f[1500];

您讀取1個文件並將其存儲在所述陣列rly1f[0]

的第一指針但是,當你顯示它你顯示指針值的陣列作爲字符,這是不你想要什麼。你應該只是做:

while (n < 1000) { 
    printf ("%c", rly1f[0][n]); 
    n++; 
    } 

注:這不會崩潰,但如果文件讀取短於1000 (BLUEPIXY建議的遞增後的修復程序n BTW或第一個字符是跳過)

將打印垃圾

所以做更簡單,因爲你的字符串是空終止,該數組傳遞給puts

puts(rly1f[0]); 

編輯:讀取文件時太你有問題。您需要1500字節,但您完全閱讀文件。如果文件大於1500字節,則會發生緩衝區溢出。

你必須計算之前分配內存的長度。比如像這(使用stat將可能是更好的選擇):

char *readFile(char *fileName, unsigned int *size) { 
... 
fseek(file,0,SEEK_END); // set pos to end of file 
*size = ftell(file); // get pos, i.e. size 
rewind(file); // set pos to 0 
code = malloc(*size+1); // allocate the proper size plus one 

注意額外的參數,它允許你返回的大小以及文件數據。

注:在Windows系統上,文本文件使用\r\n(CRLF)來界定線,所以所以有少字符分配的尺寸會比(如果你用文本方式閱讀的字符數\r\n轉換爲\n更高在你的緩衝區中:一旦你知道了確切的大小來刪除未使用的分配空間,你可以考慮一個realloc)。

+0

。無論如何,如果文件較小,那會打印垃圾。我會編輯它(留下來解釋OP錯誤,否則他會感到困惑) –

+0

另外'n'不能超過'\ 0'的索引。 – BLUEPIXY

+0

這是由讀文件函數中的分配所覆蓋的:'code = malloc(1500);''''''''''''那麼OP會忽略他/她的文件的實際大小! –