【发布时间】:2013-04-03 05:08:41
【问题描述】:
我的问题是,我认为……一切正常,但实际的块变量没有改变。它是 BLOCK 大小,为 512 个字节,其中第一个字节被列为 block.head[0,1,2,3]。所以我的程序使用 block.head[] 来查看它正在读入的文件块的前四个字节是否匹配。
所以我认为正在发生的事情是它正在将 BLOCK 数量读入文件,但实际上并没有改变 block.head 变量。因此,即使它正在读取文件的某个部分,它也不会更改它需要比较的变量。我认为在 fread 参数中写 &block 会改变这一点,但事实并非如此。
有什么想法吗?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t BYTE;
typedef uint32_t DWORD;
typedef struct
{
BYTE head[4];
DWORD restofblock[127];
}
BLOCK;
int main (void)
{
//open card.raw
FILE* fp = fopen("file.file", "r");
//default name for new files is new000.jpg
char outfile[10] = "new000.jpg";
// char* infile = argv[1];
// FILE* inptr = fopen(infile, "r");
FILE* output;
output = NULL;
//define a black
BLOCK block;
//While we haven't read past the end of the file
while (block.head[1] != EOF)
{
//read a BLOCK of the .raw file
fread(&block, sizeof(BLOCK), 1, fp);
//dual "if" statements because I couldn't figure out how to combine them
//checks to see if the first four BYTES of BLOCK block are a JPEG header
if (block.head[0] == 255 && block.head[1] == 231 && block.head[2] == 255)
{
if (block.head[3] == 239 || block.head[3] == 240)
{
fclose(output);
//designating c as a placeholder for the 3rd 0 in the filename
//checks to see if c is above or equal to "9".
//if it is, it resets "9" to "0" and increments the 2nd 0 in the filename by 1
//if it isn't it adds 1 to the 3rd "0"
char c = (outfile[5]);
if (c >= 71) //71 is the ascii equivalent of 9
{
outfile[5] -= 9;
outfile[4]++;
}
else
outfile[5]++;
//Read forward 1 BLOCK to check for EOF, if EOF is false, read back to original position and print.
//Otherwise read back to initial position.
fread(&block, sizeof(BLOCK), 1, fp);
if(block.head[0] != EOF)
{
fread(&block, -sizeof(BLOCK), 1, fp);
output = fopen(outfile, "w");
}
else
fread(&block, -sizeof(BLOCK), 1, fp);
}
}
if (output == NULL);
else
fwrite(&block, sizeof(BLOCK), 1, output);
}
fclose(output);
fclose(fp);
return 0;
}
【问题讨论】:
-
阅读
man fread:“fread() 不区分文件结尾和错误,调用者必须使用 feof(3) 和 ferror(3) 来确定发生了什么。”最好使用普通的read。if(block.head[0] != EOF)也永远不会像EOF = -1那样工作,但你的head是未签名的。另外,正如我之前提到的,fread不返回 EOF! -
我认为,
mmap和指向BLOCK的指针的递增以及 mmaped 文件的大小控制会很容易。