将数据放入C中的缓冲区

时间:2011-04-13 02:53:45

标签: c

您好 我正在读取文件中的数据,将其放入缓冲区。 现在我从文件中读取数据并将其放入缓冲区,但不知何故缓冲区中充满了一些垃圾。事实上,我从http://www.cplusplus.com/reference/clibrary/cstdio/fread/获得了代码。我总是得到结果读错误,当我检查lSize和结果的大小时,它们两个不一样。我是C或C ++的新手。有人可以帮帮我吗?我标记了C和C ++,因为我不知道哪一个是正确的。遗憾。

FILE *data_fp, *keyFile;
long lSize;
int i,j;
char hvalue[21];
char dt[300];
uint64_t insert_key;

data_fp = fopen("./aaa", "r+");
if (data_fp == NULL) {
        printf("fopen aaa error\n");
        exit(-1);
}
// obtain file size:
fseek (data_fp , 0 , SEEK_END);
lSize = ftell (data_fp);
rewind (data_fp);

// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

size_t result = fread (buffer,1,lSize,data_fp);
if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
puts(buffer);

2 个答案:

答案 0 :(得分:2)

data_fp = fopen("./aaa", "rb");

答案 1 :(得分:2)

您的文件以文字模式打开。使用ftell()确定文本模式下打开文件的长度是不可移植的,并不一定有效。

如果到达文件末尾或发生错误,

fread()可能会返回短项目计数。您必须使用feof() / ferror()来确定是哪种情况:

size_t result = fread(buffer, 1, lSize, data_fp);
if (result != lSize) {
    if (ferror(data_fp)) {
        perror("Reading error");
        exit (3);
    }
    /* End-of-file reached, so adjust file size downward */
    lSize = result;
}

(使用perror()意味着如果错误 发生,您将看到它是什么。)

另请注意,从文件读取的数据不一定是以空值终止的,因此您不能将其传递给puts()。您必须添加一个nul-terminator:

buffer[lSize] = 0;

这还需要分配一个额外的字节:

buffer = (char*) malloc (lSize + 1);

sizeof(char)定义为1,因此这里没有必要。)