gpt4 book ai didi

c - fread 返回与 nmemb 相同的数字,但已到达文件末尾

转载 作者:行者123 更新时间:2023-11-30 18:34:38 25 4
gpt4 key购买 nike

我正在完成 CS50 中的一个问题,尽管我不理解其中测试的行为,但我的代码是成功的。第 63 行 if (feof(inptr)) 检查是否到达文件末尾,然后我要求打印缓冲区指针的大小,该大小应小于其初始化值 (512) 。尽管到达了 EOF,它仍然返回值 512,这是没有意义的。

有人可以告诉我出了什么问题吗?

#include <stdio.h>
#include <string.h>


int main(int argc, char *argv[])
{
// ensure proper usage
if (argc != 2)
{
fprintf(stderr, "Usage: copy infile outfile\n");
return 1;
}

// remember filenames
char *infile = argv[1];
char *outfile = "000.jpg";

// open input file
FILE *inptr = fopen(infile, "r");
if (inptr == NULL)
{
fprintf(stderr, "Could not open %s.\n", infile);
return 2;
}

// open output file
FILE *outptr = fopen(outfile, "w");
if (outptr == NULL)
{
fclose(inptr);
fprintf(stderr, "Could not create %s.\n", outfile);
return 3;
}

// declaring variable
unsigned char buffer[512];
int count = 0;
int test = 512;

// Execute until we find end of card
while (!feof(inptr))
{

// Read buffer in card
fread(buffer, 1, sizeof(buffer), inptr);

// Checks for jpeg signature
if (buffer[0] == 0xff &&
buffer[1] == 0xd8 &&
buffer[2] == 0xff &&
(buffer[3] & 0xf0) == 0xe0)
{
fwrite(buffer, 1, sizeof(buffer), outptr);
fread(buffer, 1, sizeof(buffer), inptr);

// Checks if we are still in a jpeg, not the beginning of new one
while (buffer[0] != 0xff ||
buffer[1] != 0xd8 ||
buffer[2] != 0xff ||
(buffer[3] & 0xf0) != 0xe0)
{
// Exits loop if end of file
if (feof(inptr))
{
int size = sizeof(buffer);
printf("%i\n", size);
break;
}

fwrite(buffer, 1, sizeof(buffer), outptr);
fread(buffer, 1, sizeof(buffer), inptr);

}
if (feof(inptr))
{
break;
}

// Close jpeg
fclose(outptr);

// Change count to apply to next jpeg title
count++;

char img_num[4];
sprintf(img_num, "%03i.jpg", count);

// Assign new title to new jpeg
outfile = img_num;
printf("%s\n", outfile);
outptr = fopen(outfile, "w");

// We will have to read again in the main loop, so rewind
fseek(inptr, -512, SEEK_CUR);
}


}

printf("%i\n", test);

// close infile
fclose(inptr);

// close outfile
fclose(outptr);

// success
return 0;
}

最佳答案

sizeof(buffer) 告诉您 buffer 有多大。它不会告诉您有关其中内容的任何信息 - 不会告诉您当前有效的字节数,也不会告诉您上次 fread 中读取了多少字节。

了解 fread 读取了多少字节的正确方法是使用其返回值。您应该使用如下代码:

size_t BytesRead = fread(buffer, 1, sizeof(buffer), inptr);

如果在此语句之后,BytesRead 小于 sizeof buffer,则 fread 未读取您请求的所有字节。这表明出现了问题,并且比是否设置文件 EOF 标志更好地指示。

关于c - fread 返回与 nmemb 相同的数字,但已到达文件末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51623525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com