【发布时间】:2018-09-28 23:57:30
【问题描述】:
我正在尝试不使用lseek()、fseek 等函数将未知长度的二进制文件读入缓冲区块。
- 我使用了一次有 1024 个字节的结构缓冲区。当读取大于 1012 字节的文件时,它将分配几个缓冲区。但是,当它遇到最后一个块时,它肯定会小于或等于 1024 字节。
因此,我尝试计算最后一个块的长度,以便我可以读取最后一个块直到
eof,但我对如何实现这一点有点困惑。
提前致谢。
#include <stdio.h>
#include <stdlib.h>
typedef struct Buffer{
unsigned char data[1012];
struct Buffer *next; //12 bytes
}Buffer;
void mymemcpy(void *dest, void *src, size_t length){
Buffer *buffer_toFill = (Buffer *)dest;
Buffer *buffer_toAdd = (Buffer *)src;
int a = 0;
for(int i = 0; i < length; i++){
buffer_toFill->data[i] = buffer_toAdd->data[i];
}
}
Buffer* add_buffer_front(Buffer *head, Buffer *read_buffer, int size){
Buffer *new_buffer = malloc(sizeof(Buffer));
mymemcpy(new_buffer, read_buffer, size);
if(head != NULL){
new_buffer->next = head;
}
return new_buffer;
}
void display_List(Buffer *head, size_t length){
Buffer *current = head;
while(current != NULL){
for(int i = 0; i < length; i++){
printf("%02X",(unsigned)current->data[i]); //this shows different value compare with xxd <filename>
//printf("%c", current->data[i]);
}
Buffer *prev = current;
free(prev);
current = current->next;
}
}
int main(int argc, char **argv){
FILE *fd;
Buffer *head_buffer = NULL;
int file_length = 0;
int eof_int = 1;
if(argc != 2){
printf("Usage: readFile <filename>\n");
return 1;
}
fd = fopen(argv[1], "rb");
while(eof_int != 0){
Buffer *new_buffer = malloc(sizeof(Buffer));
eof_int = fread(new_buffer, sizeof(Buffer)-12, 1, fd);
if(eof_int == 0){
//size_t length
//
//
head_buffer = add_buffer_front(head_buffer, new_buffer, length);
file_length += length;
}else{
head_buffer = add_buffer_front(head_buffer, new_buffer, (sizeof(new_buffer->data)));
file_length += (sizeof(new_buffer->data));
}
}
display_List(head_buffer, file_length);
fclose(fd);
return 0;
}
【问题讨论】:
-
为什么不一口气把整个文件读入一个缓冲区呢?只需先使用
stat找出它的长度,分配足够的空间并读取它。 -
很遗憾,它不能用 stat() 函数实现。我真的很困惑如何避免在最后一块打印空字节。
-
正如 Ed Heal 所说,使用 stat 查找文件的长度,然后一次读取所有文件。尝试编写您拥有的代码对您有好处,但它非常复杂并且难以维护。首选更简单的解决方案,因为有可用的解决方案。
-
为什么不能使用
stat函数? -
你必须使用这种链接缓冲区的方法吗?你能用
realloc吗?实际任务是什么?
标签: c