fscanf--试图扫描整数的txt文件,fscanf只读取1s

时间:2016-02-16 20:44:18

标签: c pointers scanf

我正在尝试使用fscanf读取包含25个整数的文件并将其存储在内存中。但是,对于前12个值,似乎不是扫描文件中的实际int,而是fscanf始终显示为1.第13个值显示为-1,然后下面代码中的while循环终止。知道为什么会这样吗?谢谢你的帮助。

#include <stdio.h>
#include <stdlib.h>
#include "matrix.h"

#define ROWS 5
#define COLS 5

void load_file(FILE* file, int** p);

int main()
{


    FILE* f1;
    f1 = fopen("twenty-five-ints.txt", "r");
    int p=0;
    int* matrix = &p;
    load_file(f1, &matrix);

}

void load_file(FILE* file, int** p) {

    *p = malloc(25*sizeof(int));

    int number = 0;
    int i = 0;

    while (fscanf(file, "%d", &number) != EOF) {
        *(*p + i) = fscanf(file, "%d", &number);
        printf("%d ", *(*p + i));
        i++;
    }
    printf("\n");
}

while循环中的printf语句打印出12个用空格分隔的语句,然后是-1。

2 个答案:

答案 0 :(得分:1)

有两件事要提。

  1. 删除一个fscanf()电话。其他人,你最终会失去扫描的每一个替代价值。
  2. fscanf() 返回扫描值。如果找到macth,它会将扫描的值存储在提供的参数(&number)中。使用参数获取扫描值。您可以使用返回值来检查对fscanf()
  3. 的调用的suucess

    引用手册页,(强调我的

      

    scanf()系列函数根据格式扫描输入,如下所述。此格式可能包含转换规范;此类转换的结果(如果有)存储在格式后面的指针参数指向的位置。 [...]

答案 1 :(得分:0)

您不应该fscanf()两次,并且应该将fscanf()与要扫描的预期字段数进行比较。

while ((i < 25) && (fscanf(file, "%d", (*p + i)) == 1))
    printf("%d ", *(*p + i++));

此外,fscanf()不会返回扫描值,在这种情况下您希望它返回什么?

fscanf(file, "%s%d%", &string, &integer);

另外考虑一下:

  1. 使用索引表示法取消引用指针。
  2. 使用附加指针以避免混淆。
  3. 检查malloc()
  4. 的返回值
    void 
    load_file(FILE *file, int **data)
    {
        int *pointer;
        size_t i;
    
        *data = NULL; // So you can test this after the call to the function
    
        pointer = malloc(25 * sizeof(**data));
        /*                ^ if this is a constant, this doesn't make a lot of sense */
        /*                  because you can use an array instead.                   */
        if (pointer == NULL)
            return;
    
        for (i = 0 ; ((i < 25) && (fscanf(file, "%d", &pointer[i]) == 1) ; ++i)
            printf("%d ", pointer[i]);
        printf("\n");
    
        *data = pointer;
    }
    

    在我看来,这个功能设计很差。您无法验证读取值是否实际为25,也无法在任何地方指定。如果您希望函数以最大值读取给定数量的整数,请尝试使用

    size_t
    load_file(FILE *file, int **data, size_t maximum)
    {
        int *pointer;
        size_t i;
    
        *data = NULL; // So you can test this after the call to the function
    
        pointer = malloc(maximum * sizeof(**data));
        if (pointer == NULL)
            return;
    
        for (i = 0 ; ((i < maximum) && (fscanf(file, "%d", &pointer[i]) == 1) ; ++i)
            ;
        *data = pointer;
        return i;
    }
    

    使用此功能,您可以执行此操作

    int *data;
    // We assume that FILE * is a valid stream
    size_t count = load_file(file, &data, 25);
    if (data != NULL)
    {
        for (size_t i = 0 ; i < count ; ++i)
            fprintf(stdout, "%d ", data[i]);
        fputc('\n', stdout);
        free(data);
    }