读取 jpg 文件的简单代码 read retured 0 errno 0

simple code to read jpg files read retured 0 errno 0

我有读取 .jpg 文件的简单代码

但是我的 read returns 0 和 errno 是 0。我只是更喜欢将 read 与 read 系统调用一起使用。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

int main()
{
    int fd=open("./a.jpg",O_RDONLY);
    int i=0;
    printf("%d %d %d\n",fd,errno,O_RDONLY);
    char buffer[1500];
    while(i<1500)
    {
        int valread=read(fd,&buffer[i],100);
        //printf("[valread = %d]\n",valread);
        i=i+valread;
    }

    i=0;
    while(i<1500)
    {
        printf("%x ",buffer[i]);
        i++;
    }
    return 0;
}

任何人都可以指出上面的代码有什么问题。

循环

while (i < 1500) {
    printf("%x ", buffer[i]);
    i++;
}

不理想,如果缓冲区正确填充了 1500 字节,它将正常工作,否则行为未定义。

我建议一次性阅读整个文件,这样更简单并且避免了OP评论中指出的问题。然后,您可以使用 read 的 return 值作为打印循环的限制,而不是硬编码的 1500 值,:

int valread = read(fd, buffer, sizeof buffer);

while (i < valread) {
    printf("%x ", buffer[i]);
    i++;
}

你没告诉我们fd的值是多少,如果是正整数就表示文件打开成功,否则open调用失败。它也可以 return 0,但这是为 stdin 保留的,所以它不应该,除非你在别处关闭 stdin。您可以使用 perror 进一步诊断可能的问题。

如果 open 调用确实 return 是一个有效的文件描述符,那么一切都很好,如果输出不是您所期望的,那应该意味着该文件不包含预期的数据。

带有建议更改的示例代码:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    
    int fd = open("./a.jpg", O_RDONLY);

    if (fd < 0) {
        perror("Error");
        return EXIT_FAILURE;
    }

    int i = 0;
    char buffer[1500];

    int valread = read(fd, buffer, sizeof buffer);

    while (i < valread) {
        printf("%x ", buffer[i]);
        i++;
    }
}