c - 在尝试编写将文件分解为多个 JPG 的程序时不断出现分段错误
问题描述
正如标题所说,我一直在尝试用 C 语言编写一个程序,将一个文件转换为多个 JPG 用于 CS 练习。我已经关闭并释放了我使用过的所有东西,但我仍然遇到分段错误,我不太清楚为什么。任何建议都会有很大帮助。
编辑我已经找到了答案,事实是第一个字节块可能没有标头,这使得程序进入“else”条件并将 512 字节的空内容写入不存在的文件中。解决方案是
else
变成
else if (block[0] != 0xff && block[1] != 0xd8 && block[2] != 0xff && (block[3] & 0xf0) != 0xe0 && filenumber != 0)
希望这可以帮助某人!
typedef uint8_t BYTE;
int main(int argc, char *argv[])
{
// Checks for correct argv usage
if (argc != 2)
{
printf("Usage: filter [file]\n");
return 1;
}
FILE *f = fopen(argv[1], "r");
if (f == NULL)
{
printf("Invalid file\n");
return 1;
}
int filenumber = 0;
BYTE *block = malloc(512 * sizeof(BYTE));
char *filename = NULL;
FILE *img = NULL;
while (fread(&block, sizeof(BYTE), 512, f) == 512)
{
if (block[0] == 0xff && block[1] == 0xd8 && block[2] == 0xff && (block[3] & 0xf0) == 0xe0)
{
if (filenumber == 0)
{
filename = malloc(8);
sprintf(filename, "%03i.jpg", filenumber);
img = fopen(filename, "a");
if (img == NULL)
return 1;
fwrite(&block, sizeof(BYTE), 512, img);
filenumber++;
}
else
{
fclose(img);
sprintf(filename, "%03i.jpg", filenumber);
img = fopen(filename, "a");
if (img == NULL)
return 1;
fwrite(&block, sizeof(BYTE), 512, img);
filenumber++;
}
}
else
{
fwrite(&block, sizeof(BYTE), 512, img);
}
}
fwrite(&block, sizeof(BYTE), fread(block, sizeof(BYTE), 512, f), img);
free(filename);
free(block);
fclose(img);
fclose(f);
return 0;
}
解决方案
推荐阅读
- javascript - 验证文件是否已下载/正在下载或被 Adblock 阻止
- machine-learning - 异常检测与聚类?
- excel - Set variable to a sheet's Codename, Using it in the code isn't working
- mysql - 获取列中具有连续数字的唯一 ID 列表
- android - content_main.xml 有问题
- android - React Native、Native Android Module在View中添加TextView
- python - 尝试根据用户输入从列表列表中返回相关信息
- python - 字典熊猫中的展平列表
- java - 从异常处理程序获取元素未找到异常
- mysql - 如何从 SQL Server 生成 XML 日志文件