读书人

fscanf读取文件有关问题

发布时间: 2013-04-20 19:43:01 作者: rapoo

fscanf读取文件问题
一个奇怪的C语言问题,求高手解释:


fp_key = fopen("key.txt", "r"); //只读打开key.txt
if(fp_key == NULL) return 1; //检查是否正常打开
uint8_t key[KEYSIZE] = {0}; //定义一个数组,保存从key.txt中读到的数据
for( i = 0; i < KEYSIZE; i++) {
int j = 0;
j = fscanf(fp_key, "%i", &key[i]); //由于key.txt中为16进制,故用%i格式读取
}

key.txt中内容是oxff空格0xff...共KEYSIZE(8)个。
结果是循环变量i到了5以后,执行完fscanf后突然变成了0,然后重新开始循环,这一次循环i正常从0递增到8。
当我将key数组定义为全局变量的时候,不会出现上述问题,求高手解释啊! C
[解决办法]
引用:
key[i]是1个字节。调试过程中key[0]和key[5]能正常初始化。当key[5]正确读取后,i就突然变成了0,后续的操作就开始不正确了。如果%i给4个字节写数据,那一开始就会出错吧
请点我有右下角的引用 我才能看到你和我说话

你这里的内存分配 是这样的(注意内存分配在不同环境下 不一样 这里是具体到你的问题做分析的时候 内存分配如下)
[key0][key1][key2][key3][key4][key5][key6][key7][i]
第一次是写[key0][key1][key2][key3]
第二次是写[key1][key2][key3][key4]
第三次是写[key2][key3][key4][key5]
第四次是写[key3][key4][key5][key6]
第五次是写[key4][key5][key6][key7]
第六次是写[key5][key6][key7][key8]//循环i从0开始 i的值是5 那么是第6次
你说你你读取到的数据是0xff
在小端机器上
0xff通过%i写入内存是
0xff 0x00 0x00 0x00
[key5][key6][key7][key8]
这里 可以看到有向key8写入0x00 已经越界
那么key8是哪里
在这里key8 恰好是i的4个字节中的最高字节

i的值是5在内存中的表示为
0x05 0x00 0x00 0x00

向key8写入0x00 把原来的0x05 变成0x00
i的值在内存中是 0x00 0x00 0x00 0x00
就是你说的i的值是0

读书人网 >C语言

热点推荐