我有一个这样的文件:
36 146 10 53 240 133 104 28 51 81 124 ......
所以我想从程序中读取数字,所以我这样做:
....一些功能......
int i;
unsigned char key[16];
FILE *fp;
printf ("\n ------ \n");
// open filename
fp = fopen("key.txt","a");
printf("reading 128 bit key:\n");
for (i = 0; i < 16; i++){
fscanf(fp,"%d \t", &key[i]);
printf ("%d \t", key[i]);
}
printf ("\n ------ \n");
fclose(fp);
return 0;
但是当程序在屏幕上打印结果时,我得到:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 .....
任何想法?
答案 0 :(得分:4)
您需要以读取模式打开文件:
p = fopen("key.txt","r");
检查fscanf()的返回值以查看读取是否实际成功也是个好主意。
编辑:我刚注意到:
unsigned char key[16];
应该是一个整数的数组(我想 - 从代码中不太清楚“key”的含义是什么):
int key[16];
答案 1 :(得分:2)
不直接回答你的问题,但从不使用fscanf()
是一个好主意,因为几乎可以确定失败会使文件指针处于未知状态。
首选解决方案是使用其中一个行读取函数(如fgets()
或类似函数),然后使用sscanf()
它为您提供的字符串。
这有两个好处:
sscanf()
字符串直到你认识它为止。此外,当你scanf()
"%d"
时,它会在你的角色数组中存储一个整数。这不是你想要的,因为基础类型几乎肯定是不同的大小。扫描字符或将基础数据类型更改为整数。
和最重要的是,你是以追加而不是阅读模式打开文件。
答案 2 :(得分:0)
为什么fscanf中有空格和制表符?输入是否有标签或空格? 此外,您已打开文件以附加不读取。 (“a”用于追加,“r”用于阅读)
您可以更改fscanf以匹配您的输入并重试吗?
答案 3 :(得分:0)
一些更正:
int i;
unsigned char key[16];
FILE *fp;
printf ("\n ------ \n");
// open filename
fp = fopen("key.txt","r"); // <--- Read mode
printf("reading 128 bit key:\n");
for (i = 0; i < 16; i++){
fscanf(fp,"%c \t", &key[i]); // <--- %c, read it char by char
printf ("%d \t", key[i]);
}
printf ("\n ------ \n");
fclose(fp);
答案 4 :(得分:0)
天儿真好,
我一直很乐意再次通过K&amp; R工作,所以我只是想我会使用指针算法重写程序,打开文件的读取模式,并检查fscanf实际读取的东西。
HTH
欢呼声,
#include <stdio.h>
int main() {
unsigned int i, res, key[16];
unsigned int *val = key;
char *key_file = "key.txt";
FILE *fp;
// open filename
if ((fp = fopen(key_file,"r")) == NULL) {
fprintf (stderr, "%s: unable to open file %s\n", argv[0], key_file);
return 1;
}
printf ("------\n");
printf("reading 128 bit key:\n");
while (fscanf(fp, "%u", val) == 1) {
printf ("%u ", (*val++));
}
printf ("\n ------\n");
fclose(fp);
return 0;
}
答案 5 :(得分:0)
您需要注意阅读的数据量。你的循环将持续16次迭代,每次尝试将signed int写入'key'。在32位机器上执行此操作超过4次并且您会得到未定义的行为,因为您将在分配的16位之外写入(16个字符)。通过使用unsigned int,你可以。
格式字符串中的制表符不需要,因为空格将匹配任何空格。
int i;
unsigned int key[16]; // char -> int
FILE *fp;
printf ("\n ------ \n");
// open filename
fp = fopen("key.txt","r"); // a -> r
printf("reading 128 bit key:\n");
for (i = 0; i < 16; i++){
if (fscanf(fp,"%d ", &key[i]) == 1){ // tab removed.
printf ("%d \t", key[i]);
} else {
printf("Error reading key.\n");
}
}
printf ("\n ------ \n");
fclose(fp);
return 0;
要回答你的问题,零的原因是你用“a”打开文件,即附加。应使用“r”进行读取。