2013-07-16 102 views
2

我想在一個文件中讀取,包含以下hello.ms:FREAD跳過前8個字符

Hello World! 

使用這種C代碼:

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

int store_file(char* file_dir, char** buffer) 
{ 
    FILE* file; 
    long lSize; 
    size_t result; 
    char* tempBuffer; 

    file = fopen(file_dir, "r"); 
    if (file==NULL) 
    { 
     fputs("File error.", stderr); 
     exit(1); 
    } 

    fseek(file, 0, SEEK_END); 
    lSize = ftell(file); 
    rewind(file); 

    tempBuffer = (char*)malloc(sizeof(char)*lSize); 
    if (tempBuffer == NULL) 
    { 
     fputs("Memory error.", stderr); 
     exit(2); 
    } 

    result = fread(tempBuffer, 1, lSize, file); 
    if (result != lSize) 
    { 
     fputs("Reading error.", stderr); 
     exit(3); 
    } 

    *buffer = tempBuffer; 
    free(tempBuffer); 
    fclose(file); 

    return lSize; 
} 

void fsa_cycle(char* file_dir) 
{ 
    char* buffer; 
    int bufferSize = store_file(file_dir, &buffer); 

    fwrite(buffer, sizeof(char), bufferSize, stdout); 
} 

int main(int argc, char* argv[]) 
{ 
    if(argc < 2) 
    { 
     printf("\nSyntax: %s <file-name>\n\n", argv[0]); 
     exit(1); 
    } 

    fsa_cycle(argv[1]); 

    return 0; 
} 

它編譯完全沒有問題。沒有警告或錯誤。但它只輸出rld!

當我加入8位到hello.ms文件,然後讀取Hello World!

誰能告訴我爲什麼發生這種情況?我試圖寫fseek(文件,0,SEEK_CUR)而不是倒帶,但也沒有工作。我在Google上找不到任何幫助,並沒有暗示程序員忘記使用fseek來開始。任何援助將是真棒!

+0

當「R」保證位置指示器將在文件的開頭開不的fopen使用?你有沒有嘗試只是打開文件,並閱讀它沒有任何尋求? –

+0

你爲什麼要找?只需使用Fgets:fgets()最多隻讀取一個小於流的大小字符並將它們存儲到s指向的緩衝區中。讀取在EOF或換行符後停止。如果讀取換行符,則將其存儲到緩衝區中。終止空字節(aq \ 0aq)存儲在緩衝區中的最後一個字符之後。 – Magn3s1um

+0

@ScottyBauer那麼你尋求的理由是找到我相信的文件大小。要設置lSize變量no?雖然我不是專家。 – eatonphil

回答

3

您正在使用free來釋放tempBuffer內存,但該內存塊實際上已分配給buffer

free可能工作有不同的編譯器不同,但我的作品是你的,只是刪除free(tempBuffer);

+0

我讀過的文檔說,在完成它之後釋放malloc之後釋放tempBuffer非常重要。如果不存在,那麼釋放該內存的適當位置在哪裏?或者我不需要擔心它,因爲我正在給它分配緩衝區? – eatonphil

+0

直到將其寫入'fsa_cycle'中的'stdout'之後,纔會「完成」。 – Casey

+0

'* buffer = tempBuffer;'表示兩個指針都指向同一個內存塊。當你不再需要這個內存塊時使用'free(...)',這是,當你不需要'tempBuffer'和'buffer'時 –

1

我跑了它在gdb和不如意的事情的自由(tempBuffer)之後;

(GDB) 31如果(結果!= lSize所)

(GDB)打印tmpBuffer

在目前情況下無符號 「tmpBuffer」。

(GDB)打印tempBuffer

$ 3 = 0x602250的 「Hello World \ n!」

(GDB)N

37 *緩衝= tempBuffer;

(gdb)

38 free(tempBuffer);

(GDB)打印緩衝區

$ 4 =(字符**)0x7fffffffe180

(GDB)打印*緩衝區

$ 5 = 0x602250的「Hello World!\ n」個

(GDB)N

39 FCLOSE(文件);

(GDB)

41返回lSize所;

(GDB)打印*緩衝

$ 6 = 0x602250「」

(gdb)打印tempBuffer

$ J = 0x602250 「」

2

你太早釋放緩衝區。
使用緩衝區後應該釋放內存。行:

fwrite(buffer, sizeof(char), bufferSize, stdout); 
0

嘗試以這種方式

char *buff; 
buff = calloc(sizeOfFileInBytes + 1, sizeof(char));//replace sizeOfFileInBytes with file size (use stat to get file size) 
if (!buff) { 
    printf("error : %s", strerror(errno)); 
    fclose(f); 
} 
fread(buff, sizeOfFileInBytes, 1, f); 

fclose(f); 
printf("%s\n", (char *) buff);//lets echo what we get from fread; 
free(buff);//lets return memory to heap