gpt4 book ai didi

c - 从 C 中的二进制文件中读取

转载 作者:太空宇宙 更新时间:2023-11-04 07:09:57 24 4
gpt4 key购买 nike

我目前正在做一个项目,我必须从二进制文件中读取并通过套接字发送它,但我很难尝试发送整个文件。

这是我到目前为止写的:

        FILE *f = fopen(line,"rt");
//size = lseek(f, 0, SEEK_END)+1;
fseek(f, 0L, SEEK_END);
int size = ftell(f);
unsigned char buffer[MSGSIZE];
FILE *file = fopen(line,"rb");
while(fgets(buffer,MSGSIZE,file)){
sprintf(r.payload,"%s",buffer);
r.len = strlen(r.payload)+1;
res = send_message(&r);
if (res < 0) {
perror("[RECEIVER] Send ACK error. Exiting.\n");
return -1;
}
}

我认为这与我读入的缓冲区大小有关,但我不知道它的正确公式是什么。

还有一点,sprintf 是否正确完成?

最佳答案

如果您正在读取二进制文件,NUL 字符可能会出现在文件中的任何位置。

因此,使用像 sprintfstrlen 这样的字符串函数是个坏主意。如果您确实需要使用第二个缓冲区 (buffer),您可以使用 memcpy。您也可以直接读入 r.payload(如果 r.payload 已经分配了足够的大小)。

您正在寻找二进制文件的 freadfread 的返回值告诉您有多少字节被读入您的缓冲区。

您也可以考虑再次调用 fseek。看这里How can I get a file's size in C?

也许你的代码看起来像这样:

#include <stdint.h>
#include <stdio.h>

#define MSGSIZE 512

struct r_t {
uint8_t payload[MSGSIZE];
int len;
};

int send_message(struct r_t *t);

int main() {
struct r_t r;
FILE *f = fopen("test.bin","rb");
fseek(f, 0L, SEEK_END);
size_t size = ftell(f);
fseek(f, 0L, SEEK_SET);
do {
r.len = fread(r.payload, 1, sizeof(r.payload), f);
if (r.len > 0) {
int res = send_message(&r);
if (res < 0) {
perror("[RECEIVER] Send ACK error. Exiting.\n");
fclose(f);
return -1;
}
}
} while (r.len > 0);
fclose(f);
return 0;
}

关于c - 从 C 中的二进制文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29187070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com