我正在尝试使用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。
答案 0 :(得分:1)
有两件事要提。
fscanf()
电话。其他人,你最终会失去扫描的每一个替代价值。fscanf()
返回扫描值。如果找到macth,它会将扫描的值存储在提供的参数(&number
)中。使用参数获取扫描值。您可以使用返回值来检查对fscanf()
。引用手册页,(强调我的)
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);
另外考虑一下:
malloc()
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);
}