gpt4 book ai didi

c - Windows/TCC/C读取二进制文件指针随机跳转

转载 作者:行者123 更新时间:2023-11-30 15:38:04 24 4
gpt4 key购买 nike

我已经在 google 上对此进行了广泛的搜索,现在已经花费了 4 个小时,我希望有人可以帮助我。

我有一个简单的程序来读取大约 2.7 MB 的二进制文件。该程序使用 tcc 编译器在 Windows 上编译。我在各种高级语言(Pascal、Modula2、Matlab、PHP、Basic)方面经验丰富,但对 C 很陌生,怀疑这与内存分配和变量被覆盖有关。

void main ()
{
long int start_loc;
long int actual_loc;
int seek_result;
char file_to_process[]="d:/tmp/pfc/test.out";
char read_int;
int spaces;
int read_result;
FILE *data_file;
//fpos_t position;

data_file=fopen(file_to_process,"r");

if (data_file == NULL) {
printf("Error");
}

start_loc = 1002;

printf("\n size of start_loc : %d",sizeof(start_loc));

actual_loc = ftell(data_file);
printf("\nBEFORE location %d \n",actual_loc);

seek_result = fseek(data_file, start_loc, SEEK_SET); //move to start of search location in the file

actual_loc = ftell(data_file);
printf("\n AFTER seek location %d \n",actual_loc);

fread(&read_int, 1, 1, data_file);

actual_loc = ftell(data_file);
printf("\n AFTER read location %d \n",actual_loc);
printf("\n read result %x" ,*&read_int);

fread(&read_int, 1, 1, data_file);
actual_loc = ftell(data_file);
printf("\n AFTER read location %d \n",actual_loc);
printf("\n read result %x" ,*&read_int);


fclose(data_file);
return;
}

在上面的示例中,我从文件中的位置 1002 读取 - 这工作正常 - 结果是:

size of start_loc : 4
BEFORE location 0

AFTER seek location 1002

AFTER read location 1003

read result 0
AFTER read location 1004
read result 3

一切都按预期工作 - 每读取一个字节,文件指针就会前进 1 个字符。

问题出现在起始位置的某些值上,例如

start_loc = 16000

在这种情况下,文件指针在命令之后以看似随机的方式跳转,例如即读取1个字节,文件指针移至19586。

size of start_loc : 4
BEFORE location 0

AFTER seek location 16000

AFTER read location 19585

read result 47
AFTER read location 19586

read result 0

感谢您阅读本文!

最佳答案

您的文件以文本模式 (r) 打开,在文本模式下,C++ 引用资料介绍了 ftell 函数:对于文本流,数值可能没有意义,但仍可用于稍后使用 fseek 将位置恢复到相同位置(如果使用 ungetc 放回的字符仍待读取,则行为未定义)。

因此,您得到的内容似乎与文档一致,因此您不必担心。

请注意,如果您想将其作为二进制文件打开,则应在 fopen 模式后附加“b”。

关于c - Windows/TCC/C读取二进制文件指针随机跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21945388/

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