c - 使用 fread 将图像作为二进制文件读取时出现问题
问题描述
我是 C 编程语言领域的新手,我试图将图像读取为二进制文件。不幸的是,当我尝试读取文件时,我得到了一个不完整的序列("\377\330\377", <incomplete sequence \340>)
。我已经尝试使用 fread 仅读取一个字节的大小,现在我正在尝试使用sizeof(unsigned char)
,但我总是得到相同的不完整序列。这是代码的一部分:
caratteri **createStruct(unsigned char c[], caratteri car[], caratteri *ptr[], long size) {
for (long i = 0; i < size; i++) {
ptr[i] = &car[i];
car[i].first = &c[i];
car[i].last = &c[(size - 1 + i) % size];
car[i].index=i;
}
return ptr;
}
int compare(const void *a, const void *b) {
caratteri *ca = *(caratteri **) a;
caratteri *cb = *(caratteri **) b;
unsigned char *c1;
unsigned char *c2;
c1 = ca->first;
c2 = cb->first;
while (*c1 - *c2 == 0) {
c1++;
c2++;
}
return (*c1 - *c2);
}
caratteri **bwt(long size, FILE *file) {
FILE *risultato;
unsigned char *c = malloc(sizeof(unsigned char) * size);
fread(c, sizeof(unsigned char), size, file);
caratteri *car = malloc(sizeof(caratteri) * size);
caratteri **pCaratteri = malloc(sizeof(caratteri *) * size);
pCaratteri = createStruct(c, car, pCaratteri, size);
qsort(pCaratteri, size, sizeof(pCaratteri), compare);
risultato=fopen("risultato","wb");
for(long i = 0; i < size; i++)
fputc(*pCaratteri[i]->last,risultato);
fclose(risultato);
return pCaratteri;
}
int main() {
FILE *file;
file = fopen("thumbnail.jpg","rb");
if (file == NULL) {
printf("Errore di apertura file!");
exit(2);
}
fseek(file, SEEK_SET, SEEK_END);
long size = ftell(file)+1;
rewind(file);
caratteri **car = bwt(size, file);
FILE *risultato;
decryptbwt(risultato);
return 0;
}
这不是完整的代码,但我需要这部分才能正常工作。此外,我需要此代码来处理各种文件(.txt、.jpg、.png 等),如果是 txt 文件,我需要 \0 字符,这就是我使用的原因ftell(file)+1
但我不确定这是否合适。无论如何,如何以二进制模式读取文件以避免序列不完整的问题?谢谢你的回答,很抱歉这个愚蠢的问题,但我是这个世界的新手。我需要额外的 \0 因为我使用的算法需要字符串字符的结尾,这就是我使用 ftell 和 +1 的原因。这个算法应该适用于每一种文件,所以我需要正确读取它,然后使用 burrows Wheeler 变换来对我需要压缩的文件进行排序。另外,我不确定是否必须以这种方式使用 fseek,但我认为没有其他方法可以获取文件的大小。
解决方案
推荐阅读
- numpy - Numpy:不允许负尺寸
- r - 将“AsIs”类转换为 R 中的 data.frame
- go - for循环中的隐式内存别名
- typescript - 在 type-graphql 中传递 typescript type 问题
- reactjs - React 嵌套循环和键
- php - 从日期时间字段计算年龄 - Wordpress UserFrontEnd Pro
- python - 在同一封电子邮件中发送查询中返回的所有数据
- javascript - 如果我直接单击另一个标记,Leaflet popupopen 事件不会触发
- google-bigquery - 谷歌分析到大查询
- recommendation-engine - 在 Amazon Personalize 中推荐具有可用日期的商品