2

我正在尝试读取包含以下内容的 hello.ms 文件:

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!

当我在 hello.ms 文件中添加 8 个空格时,它会读取Hello World!

谁能告诉我为什么会这样?我尝试编写 fseek(file, 0, SEEK_CUR) 而不是 rewind 但这也不起作用。我在 Google 上找不到任何不建议程序员忘记使用 fseek 开始的帮助。任何帮助都会很棒!

4

4 回答 4

3

您正在使用free释放tempBuffer内存,但该内存块实际上分配给buffer.

free使用不同的编译器可能会有所不同,但我的和你的一样,只需删除free(tempBuffer);

于 2013-07-16T20:25:19.103 回答
2

您过早地释放缓冲区。
您应该在使用缓冲区后释放内存。该行:

fwrite(buffer, sizeof(char), bufferSize, stdout);
于 2013-07-16T20:30:26.800 回答
1

我在 gdb 中运行它,但在 free(tempBuffer); 之后出现了问题;

(gdb) 31 如果(结果!= lSize)

(gdb) 打印 tmpBuffer

当前上下文中没有符号“tmpBuffer”。

(gdb) 打印临时缓冲区

$3 = 0x602250“你好世界!\n”

(gdb) n

37 *缓冲区=临时缓冲区;

(gdb)

38 空闲(临时缓冲区);

(gdb) 打印缓冲区

$4 = (char **) 0x7ffffffffe180

(gdb) 打印 * 缓冲区

$5 = 0x602250“你好世界!\n”

(gdb) n

39 fclose(文件);

(gdb)

41 返回 lSize;

(gdb) 打印 * 缓冲区

$6 = 0x602250 ""

(gdb) 打印临时缓冲区

$7 = 0x602250 ""

于 2013-07-16T20:27:43.490 回答
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
于 2013-07-17T06:36:05.937 回答