这是一个让每个人都意识到的项目。这是我在 C 语言中的第一个项目,并且有关于lseek()
和移动文件指针的问题。
现在我可以读取位图文件的位图和 DIB 标头。我现在需要遍历像素并以某些方式操作它们。我已经用伪代码写出了我打算如何处理这种操作。但是我很难理解如何正确使用lseek
,因为我的代码不断收到incompatible pointer to integer conversion...
警告。我将给出我的主要方法的一个简短示例,因为这是一个项目:
int main(int argc, const char * argv[]) {
FILE *fp;
if((fp = fopen(argv[1], "r+b")) == NULL){
printf("Error: Unable to open file.\n");
exit(0);
}
fseek(fp, 0, SEEK_END);
long fsize = ftell(fp);
rewind(fp);
char test; // simply to test overwriting the current byte
fread(&test, sizeof(char), 1, fp);
test = ~test;
lseek(fp, -1, SEEK_CUR); //produces error
//also tried fseek prior to realizing I should be using lseek to move my pointer.
fwrite(&test, 1, sizeof(char), fp);
fclose(fp);
return 0;
}
同样,不要试图提供太多我的代码,因为这是一个项目。但我想帮助了解如何正确使用lseek
。我注意到它返回了一个int
值,所以我知道这是因为我的文件指针是FILE
. 但是使用这种方法的正确方法是什么?我看到了一个例子,它在读写模式下打开了同一个文件,其中写入模式使用lseek
. 但由于某种原因,我不知道这是否正确。
已编辑 基于两个成员的响应,我将上面的代码更改为:
rewind(fp);
lseek(fileno(fp), hdr.offset, SEEK_CUR); //hdr.offset == 54 bytes
printf("FD FILENO: %d\n", fileno(fp)); // prints 3???
printf("CURRENT POS: %p\n", fp); //prints 0x7fffe7eae0b0 (I understand it's an address)
fread(&test, sizeof(char), 1, fp);
lseek(fileno(fp), -1, SEEK_CUR);
fwrite(&test, 1, sizeof(char), fp);
printf("CURRENT POS: %p\n", fp); //prints the same address as above?
除了与 C 相关的一切,我没有得到什么?