读取的文件数始终为 0

Number of files read is always 0

这是我写的一小段代码。请注意-

  1. rawbytes 指向的文件 > 512 字节
  2. 我是用“r”还是“rb”打开正在读取的文件?除了几个 JPEG,我不知道里面有什么。
  3. 为什么我的 fread 总是输出 0,即使我将其设为 fread(bytes, 1, 512, rawbytes)?

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

int main(int argc, string argv[])
{
    // Declaring a new type 
    typedef uint8_t BYTE;
    
    // Declaring an array of bytes, in which I want to read 512 bytes
    BYTE bytes[512];
    
    FILE *rawbytes = fopen(argv[1], "rb");
    int numberofbytesread = fread(bytes, 1, 512, rawbytes);
    
    // Check
    printf("%i\n", numberofbytesread);
    fclose(rawbytes);
}

编辑 1: 将 int 数据类型更改为 size_t 数据类型。新代码:

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

int main(int argc, string argv[])
{
    // Declaring a new type 
    typedef uint8_t BYTE;

    // Declaring an array of bytes, in which I want to read 512 bytes
    BYTE bytes[512];

    FILE *rawbytes = fopen(argv[1], "rb");
    size_t numberofbytesread = fread(bytes, 1, 512, rawbytes);

    // Check
    printf("%zu\n", numberofbytesread);
    fclose(rawbytes);
}

我不知道 %zu 是什么,但编译器告诉我用 %zu 交换 %i。仍然读取 0 个字节。 :(

编辑 2: 为了使问题可重现,我已将 argv[1] 替换为我负责 'recover' JPEG 文件的存储卡文件称为 card.raw。这段代码只是我写的一小段代码,用于检查我是否能够从 card.raw

中读取至少 512 个字节

执行wget https://cdn.cs50.net/2019/fall/psets/4/recover/recover.zip下载一个(压缩的)ZIP 文件与这个问题的分布。 执行 unzip recover.zip 解压缩该文件。

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

int main(int argc, string argv[])
{
    // Declaring a new type 
    typedef uint8_t BYTE;

    // Declaring an array of bytes, in which I want to read 512 bytes
    BYTE bytes[512];

    FILE *rawbytes = fopen("card.raw", "rb");
    if (rawbytes == NULL)
    {
           return 1;
    }

    size_t numberofbytesread = fread(bytes, 1, 512, rawbytes);

    // Check
    printf("%zu\n", numberofbytesread);
    fclose(rawbytes);
}

这里好像还可以

我在这里试过了,它适用于本地文件。然后我尝试了这个 card.raw 似乎也可以。第一个块只有零,第二个有一个惊喜,然后它继续数据。

  • 第三个块似乎是一个有效的 jpeg 签名...

  • 除了显示数据,我没有更改你的代码
  • 在 CL 19.27 下编译。请不要在这里讨论宗教问题。
  • 只要有数据,代码就会继续读取...等待块之间的键

这是代码

#include <ctype.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
//#include <cs50.h>

int main(int argc, char** argv)
{
    // Declaring a new type 
    typedef uint8_t BYTE;

    // Declaring an array of bytes, in which I want to read 512 bytes
    BYTE bytes[512];

    FILE* rawbytes = fopen("card.raw", "rb");
    if (rawbytes == NULL) return 1;
    // ok file is open
    size_t numberofbytesread = 0;
    size_t block = 0;
    char ch;
    while ((numberofbytesread = fread(bytes, 1, 512, rawbytes)) > 0)
    {
        printf("\n%zu bytes read:\n\n\t000    ", numberofbytesread);
        int col = 0;
        for (size_t i = 0; i < numberofbytesread; i += 1)
        {
            if(isprint(bytes[i]))
                printf("%2c  ", bytes[i]);
            else
                printf("%02X  ", bytes[i]);
            col += 1;
            if (col % 16 == 0) printf("\n\t%3d    ",i+1);
        };  // for()
        if (col % 16 == 0) printf("\n");
        block += 1;
        printf("Block: %zd. Press ENTER \n", block); 
        ch = fgetc(stdin);
    };
    fclose(rawbytes);
}