2013-07-16 58 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