如何从c(linux)中的非文本文件读取?

我试图通过UDP套接字发送文件(一次一个块)。 它可以正常工作.txt文件,但是当我尝试从.jpg / .rar读取它只读取几个字节(小于我“问”),即使这些文件是> 2MB。

我尝试使用打开/ pread(我也尝试使用lseek和读取)和fopen(二进制模式)/ fread / fseek和我得到相同的结果(即对于一个2MB的.jpg文件我得到这个输出“读取10偏移量0" )。 请告诉我我做错了什么。

这是负责从文件中读取块的代码:

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); ... } 

二进制文件可以包含NULL字节, strlen在找到这样一个NULL字节后将停止计数。 使用pread的返回值来找出pread的大小。

所有的str *函数都需要C字符串,它必须以NULL字节结尾 ,而不能在中间。

由于buff是二进制数据,所以不能使用strlen (buff) 。 在执行pread ,您在n中捕获的返回值包含读取的字节数。 你应该用sendto来代替psize

pread()读取从偏移量偏移量(从文件开头)的文件描述符文件中的字节到buf开始的缓冲区。 文件偏移量不会更改。 由于它是一个二进制文件,所以strlen不能在这里工作…因此,使用pread并初始化psize来返回pread()的值。