gpt4 book ai didi

c - 循环遍历数据文件末尾

转载 作者:行者123 更新时间:2023-11-30 20:04:45 25 4
gpt4 key购买 nike

我一直在为哈佛 CS50 类(class)解决一组问题,我们的任务是从存储卡中恢复 jpeg。该卡按顺序存储 jpg。在编写我的程序时,我决定使用 while 循环来保持循环直到 EOF,但是使用类(class)中包含的调试器,我发现我的循环从未启动。我在下面包含了我的代码,我真的希望有人可以帮助我理解我在循环中出错的地方。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main(int argc, char* argv[])
{
// Ensure proper Usage
if (argc != 1)
{
printf("This file takes no input commands!\n");
return 1;
}

// open up card data file
FILE* dataFile = fopen("card.raw", "r");
if (dataFile == NULL)
{
char* invalidFile = "card.raw";
printf("Could not open %s.\n", invalidFile);
return 2;
}

// Create variable to keep track of num of output files written
int numFiles = 0;

// Create buffer
int* buffer = (int*)malloc(sizeof(int*) * 512);

// Create new file conditions
bool a = buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff;
bool b = buffer[3] == 0xe0 || buffer[3] == 0xe1|| buffer[3] == 0xe2 ||
buffer[3] == 0xe3 || buffer[3] == 0xe4 || buffer[3] == 0xe5 ||
buffer[3] == 0xe6 || buffer[3] == 0xe7 || buffer[3] == 0xe8 ||
buffer[3] == 0xe9 || buffer[3] == 0xea || buffer[3] == 0xeb ||
buffer[3] == 0xec || buffer[3] == 0xed || buffer[3] == 0xee ||
buffer[3] == 0xef;

// Loop through until all files found
while(fread(&buffer, 512, 1, dataFile) == 1)
{
if(a && b)
{
// Create temporary storage
char title[999];
// print new file name
sprintf(title, "%d.jpg", numFiles);
// open new file
FILE* img = fopen(&title[numFiles], "a");
numFiles = numFiles + 1;
fwrite(&buffer, sizeof(buffer), 1, img);
free(buffer);
}
else
{
if(numFiles > 0)
{

}
}
}
}

最佳答案

好吧,您可能有不止一个误解。

首先看一下 fread手册页 :

On success, fread() and fwrite() return the number of items read or written.

因此,如果您请求 512 字节,您应该期望它返回 512。如果它返回较少,您就知道:要么到达文件末尾,要么出现问题。

此外,如果您分配:

bool a = something;
bool b = somethingElse;

然后:

while(somethingEntirelyElse) {
// Never update the value of a or b
if(a && b) { ... }
// Neither here ...
}

那么您可以称该支票为多余,不是吗?

除非ab实际上是 volatile 。但是不要去那里!

在您的情况下,ab的赋值很可能属于while循环内部

然后,您在循环外分配一次缓冲区,但每次实际写下来时释放它。在下一次迭代中,您遇到段错误

您是否考虑过如果任何图像文件的大小超过 512 字节并且图像未正确对齐会发生什么情况?

更好的方法是保存一个文件的开头位置,一旦遇到 EOF(您并不是真正在寻找...),您就会知道文件的确切大小以及有多大你的缓冲区必须是。

<小时/>

总之,我同意一些评论者的观点,即您确实应该看看一些早期的作业,看看您是否可以从中学到一些东西。

<小时/>

类比时间:

假设您有一本书,并且您想要复制上面有图像的每一页。你告诉自己:哦,我只是遵循一个简单的算法,所以我可以考虑其他事情。

您的算法是:

  • 拥有复印机

  • 准备一个笔记本,在上面记下页面是否包含图像。

  • 看一下(截至目前已合上的书),看看是否有图像。 -> 在笔记本上写下结果

  • 只要下一页上只有一个字母就开始翻页。 (不多也不少)-> 在大多数情况下你会立即停止

  • 如果笔记本显示:有一张图像,请复制此页(请注意,笔记本会显示您第一次在上面写的任何内容)

  • 如果您刚刚复印了一张图像,请扔掉您的复印机(并且不必为下一张图像购买新的复印机)

关于c - 循环遍历数据文件末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36812576/

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