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

时间:2013-04-16 20:20:47

标签: c linux

我正在尝试通过UDP套接字发送文件(一次一个块)。它适用于.txt文件,但是当我尝试从.jpg / .rar读取时,它只读取几个字节(小于我“询问”),即使文件大于2mb。

我尝试使用open / pread(我也尝试使用lseek和read)和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);
...
}

3 个答案:

答案 0 :(得分:4)

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

所有str *函数都需要C字符串,它必须结束并带有NULL字节,并且不能将它们放在中间位置。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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