我从Java和C#回到C语言。我坚持使用以下简单程序尝试从具有函数的文件中读取两个数组。任何人都可以指出我搞砸了哪里?
编译说: 错误:二进制*的操作数无效(有'int *'和'int *')
文件格式为
4
1 2 3 4
23 23 14 11
我的ReadFromFile
函数需要从文件中填充缓冲区A
和B
。
#include<stdio.h>
void ReadFromFile (const char* file_name, int *A, int *B, int *length)
{
FILE* file = fopen (file_name, "r");
fscanf (file, "%d", length);
int i;
for(i = 0; i < length; i++)
{
fscanf (file, "%d", A+i);
}
for(i = 0; i < length; i++)
{
fscanf (file, "%d", B+i);
}
fclose (file);
}
int main()
{
int *A; int *B; int length;
ReadFromFile("input.txt", A, B, &length);
return 0;
}
答案 0 :(得分:1)
int main()
{
int A; int B; int length;
ReadFromFile("input.txt", &A, &B, &length);
return 0;
}
尝试使用A和B作为变量而非指针,并使用地址调用函数。
我不确定这是不是问题。但试一试。
抱歉,我对int指针感到困惑。我猜你想要的是int[] A
实际上和int* A
相同。但是你必须为数组分配一些内存或者用给定的大小初始化它。
答案 1 :(得分:1)
在您的函数中,您使用A + i来访问未由您分配的内存中的位置。 换句话说:首先需要调用malloc来获取内存。
在这里考虑一下你的结构: 您有地址变量A和B,但您从未将它们指向已分配内存的地址。如果要在功能之前执行此操作,则需要知道阵列的长度。如果你想在你的函数中执行它,你需要传递A和B的地址来分配它:
void ReadFromFile (const char* file_name, int** A, int** B, int* length)
{
FILE* file = fopen (file_name, "r");
fscanf (file, "%d", length);
*A = (int*) malloc(length * sizeof(int))
// now use (*A)+i
然后你会改变主
int* A; int* B; int length;
ReadFromFile("input.txt", &A, &B, &length);
答案 2 :(得分:1)
首先A
和B
是指向垃圾的指针,如果你真的想存储某些东西(或者期望分段错误或内存损坏),你需要分配空间。
抱怨你的for循环。 length
永远不会被初始化,因此您无论如何都要发送一个指向垃圾数据的指针(或者从文件中读取它永远不会填充)。
i < length
无效(在这种意义上),因为您将int
值与地址或int *
进行比较(这没有意义)。你的意思可能是i < *length
;因为length
是一个指针,需要为其实际值取消引用。
答案 3 :(得分:1)
调用您的函数时,您应该提供地址参考,例如&amp; A和&amp; B
这就是你应该如何正确阅读文本文件:)
FILE *file = fopen(file_name, "r");
while(file != EOF){
fscanf(...)
}
修改强>:
您不需要使用双指针。只需在main()
整数Int A,B
中初始化,并为您的方法提供地址。
答案 4 :(得分:1)
void ReadFromFile (const char* file_name, int *A, int *B, int *length)
/* ... */
for(i = 0; i < length; i++)
{
fscanf (file, "%d", A+i);
}
您从A
传入了一个整数main()
,但在这里您尝试访问完全不相关的内存。同样适用于B
。您的意思是将A
和B
分配为数组吗?
e.g。改变:
int *A; int *B; int length;
到
int A[100], B[100], length;
或类似的东西。 (也许一旦你知道你需要多少数量就动态分配数组 - 或者用malloc(3)
分配它们,如果需要的话,用realloc(3)
增长它们。)