fscanf阅读问题

时间:2009-06-29 10:07:41

标签: c scanf

抱歉,也许这是一个愚蠢的问题。

我有一个这样的文件:

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 .....

任何想法?

6 个答案:

答案 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”进行读取。