如何在C语言(Linux)中从非文本文件中读取?

3
我正在尝试通过UDP套接字发送文件(一次一个块)。对于.txt文件,它正常工作,但是当我尝试从.jpg/.rar读取时,它仅读取了几个字节(少于我“请求”的字节数),即使文件大小大于2mb。
我尝试使用open/pread(我还尝试过使用lseek和read)和fopen(以二进制模式)/fread/fseek,但我得到相同的结果(例如,对于一个2mb的.jpg文件,我得到这个输出“从偏移量0处读取10”)。
请告诉我我做错了什么。
以下是负责从文件中读取块的代码:
void * work(void * p){
...
int psize=100;
int file;
//FILE *file;

//open the file
file=open(wArg.req.fileName, O_RDONLY);
//file=fopen(wArg.req.fileName, "rb");

//read the file chunk from the offset
buff=(void *) malloc(psize);
n=pread(file, buff, psize, wArg.req.offset);
//fseek(file,wArg.req.offset, SEEK_SET);
//fread(buff, 1, psize, file);
if(n<0){
    perror("read");
    exit(1);
}

printf("read %d from offset %d\n", (int)strlen(buff),wArg.req.offset);

n=sendto(wArg.sock, buff, psize, 0, (struct sockaddr*)&caddr, sizeof(struct sockaddr_in));
printf("sent %d\n", (int)strlen(buff));


close(file); 
//fclose(file);
...
}

请务必检查malloc返回的值是否有效。由于内存不足,可能无法分配buff - Dave Jarvis
pread()是什么?如果你总是使用gcc标志“-Wall -Werror”,你的生活可能会变得更加轻松。 - ott--
3个回答

4

二进制文件可能包含NULL字节,strlen会在找到这样的NULL字节后停止计数。使用pread的返回值来查找buffer的大小。

所有str*函数都期望C字符串,这些字符串必须以NULL字节结尾,不能在中间出现。


2

您不能使用 strlen (buff),因为buff是二进制数据。当您执行pread时,您在n中捕获的返回值包含读取的字节数。您应该使用它而不是sendto中的psize


0

pread()函数从文件描述符file的偏移量offset处(从文件开头开始)读取最多count个字节到以buf为起始地址的缓冲区中。文件偏移量不会改变。 由于这是一个二进制文件,因此strlen无法在此处工作... 因此,请使用pread并将psize初始化为pread()的返回值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接