2016-12-26 54 views
3

我用fwrite來存儲一些數據,現在我試圖用fread來讀取txt文件中的數據進行處理。我想單獨閱讀這些值,但我無法弄清楚如何做到這一點。這是我曾嘗試:如何使用fread按值讀取文件值?

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

int main() 
{ 
    FILE * pFile; 
    long lSize; 
    unsigned short * buffer; 
    size_t result; 

    pFile = fopen ("myfile.txt" , "rb"); 

    // obtain file size: 
    fseek (pFile , 0 , SEEK_END); 
    lSize = ftell (pFile); 
    rewind (pFile); 

    // allocate memory to contain the whole file: 
    buffer = (unsigned short *) malloc (sizeof(unsigned short)*lSize); 

    // copy the file into the buffer: 
    result = fread (buffer,1,lSize,pFile); 

    printf("%uz\n", result); 

    // terminate 
    fclose (pFile); 
    free (buffer); 
    return 0; 
} 

上述程序編譯罰款,但是當我./a.out運行它,我得到一個分割故障。當我用sudo ./a.out運行它時,我沒有收到seg錯誤,但沒有打印出來。 任何想法我可以做什麼來解決它?

+0

做一些錯誤檢查這裏:'PFILE = fopen(「myfile.txt」,「rb」);' –

+0

@πάνταῥεῖ什麼窩我檢查?這只是打開文件。只要我得到了正確的文件名,它應該可以正常工作。 –

+0

你從來沒有根據'NULL'檢查返回值! –

回答

1

問題,我看到:

分配更多的內存比需要

lSize = ftell (pFile); 

lSize設置爲字符的文件的數量,而不是unsigned short S上的號碼後。因此,您需要

buffer = malloc(lSize); 

請參閱Do I cast the result of malloc?。如果您使用的是C++編譯器(因爲您的C++標籤似乎暗示),則需要將返回值設置爲malloc

錯誤格式說明

printf("%s\n", result); 

使用錯誤的格式說明打印result。您需要使用

printf("%zu\n", result); 

該行是您所看到的分段錯誤最可能的罪魁禍首。


閱讀對象逐一

您當然可以使用:

size_t count = lSize/sizeof(short); 
for (size_t i = 0; i < count; ++i) 
{ 
    unsigned short number; 
    result = fread (&number, sizeof(unsigned short), 1, pFile);   
} 

您還可以使用:

size_t count = lSize/sizeof(short); 
for (size_t i = 0; i < count; ++i) 
{ 
    result = fread (buffer+i, sizeof(unsigned short), 1, pFile);   
} 
+0

但寫入文件的值是unsigned short類型。當我按照你所說的去做時,我會在屏幕上打印出一堆'1z'。 –

+0

'fread'的返回值是讀取的對象數。如果您一次讀取一個對象,'result'的值將爲'1'。由於我建議的格式錯誤,您會看到'1z'作爲輸出。它需要是「%zu」而不是「」%uz「'。我在答案中解決了錯誤。 –

相關問題