首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

fscanf读取文件有关问题

2013-04-20 
fscanf读取文件问题一个奇怪的C语言问题,求高手解释:fp_key fopen(key.txt, r)//只读打开key.txtif

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

热点排行