我正在尝试从txt文件中读取整数并将它们存储在一维数组中。我尝试了几种方法,但无法正常工作。 我的文本文件在
下面1 2
2 1
3 2
2 1
1 2
2 1
3 2
2 1
1 2
2 1
3 2
2 1
这是我的代码
#include <stdio.h>
#include <stdlib.h>
int main(void) // usually we write void when main doesn't take args
{
int i;
int j;
/*matrix*/
int *mat = malloc((12* 2* sizeof ( int))); // no casting!
FILE *file;
file=fopen("test.dat", "r"); // extension file doesn't matter
if(!file) {
printf("File not found! Exiting...\n");
return -1;
}
for(i = 0; i < 12; i++)
{
for(j = 0; j < 2; j++)
{
if (!fscanf(file, "%d", &mat[i*2 + j])){
printf("error!\n");
break;
}
//fscanf(file, "%d", &mat[i*2 + j]);
printf("ok!\n");
printf("%d \t",mat[i*2 + j]); // mat[i][j] is more clean
}
printf("\n");
}
free(mat);
fclose(file);
return 0;
}
感谢您的帮助! 的 ****** **** UPDATE 我发现第一个问题是我无法读取文件,但后来发现我只能打印一个值,而不是24个值
./print_mat
ok!
1 error!
error!
error!
error!
error!
error!
error!
error!
error!
error!
error!
error!
答案 0 :(得分:3)
代码很好。可能segmentation fault
的原因是文件无法打开(可能无法找到文件)。
如果文件中包含的数据不如预期,则可能会出现问题。
你可以这样检查:
#include <stdio.h>
#include <stdlib.h>
int main(void) // usually we write void when main doesn't take args
{
int i;
int j;
/*matrix*/
int *mat = malloc((12* 2* sizeof ( int))); // no casting!
FILE *file;
file=fopen("test.txt", "r"); // extension file doesn't matter
if(!file) {
printf("File not found! Exiting...\n");
return -1;
}
for(i = 0; i < 12; i++)
{
for(j = 0; j < 2; j++)
{
if (!fscanf(file, "%d", &mat[i*2 + j]))
break;
printf("ok!\n");
printf("%d\n",mat[i*2 + j]); // mat[i][j] is more clean
}
}
free(mat);
fclose(file);
return 0;
}
Why not to cast what malloc
returns
[编辑]
更好的错误输出可以这样做:
if(!file) { // equivalent to file == NULL
perror("File not found! Exiting...\n");
return -1;
}
现在,当无法打开文件时,您将获得perror
内的输出
以及错误消息。
我试图打开一个不存在的文件并获得
File not found! Exiting...
: No such file or directory
您可能没有与主文件位于同一目录中的文件。
致Olaf Dietsche和pmg的评论。
正如另一个答案所述,您始终可以使用debugger
来查找问题所在。
很多人使用valgrind。
当OP发现时,scanf()
将无法解析文件,当值以逗号而不是空格分隔时。
答案 1 :(得分:0)
我已经测试了你的程序,并且在我的配置上它运行时没有出错。
您机器的配置是什么?编译器等?
也许您应该检查工具valgrind以在执行期间查找内存泄漏,请参阅:http://www.cprogramming.com/debugging/valgrind.html 它帮助我追踪了一些seg故障。