从文件中读取数组

时间:2012-04-04 07:03:41

标签: c

我从Java和C#回到C语言。我坚持使用以下简单程序尝试从具有函数的文件中读取两个数组。任何人都可以指出我搞砸了哪里?

编译说: 错误:二进制*的操作数无效(有'int *'和'int *')

文件格式为

    4
    1   2   3   4
    23  23  14  11

我的ReadFromFile函数需要从文件中填充缓冲区AB

#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;
}

5 个答案:

答案 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)

首先AB是指向垃圾的指针,如果你真的想存储某些东西(或者期望分段错误或内存损坏),你需要分配空间。

抱怨你的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。您的意思是将AB分配为数组吗?

e.g。改变:

int *A; int *B; int length;

int A[100], B[100], length;

或类似的东西。 (也许一旦你知道你需要多少数量就动态分配数组 - 或者用malloc(3)分配它们,如果需要的话,用realloc(3)增长它们。)