1

我从 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;
}
4

5 回答 5

1
int main()
{
    int A; int B; int length;
    ReadFromFile("input.txt", &A, &B, &length);

    return 0;
}

尝试使用 A 和 B 作为变量而不是指针,并使用地址调用函数。

我不确定这是否是问题所在。但是试一试。

抱歉,我被 int 指针弄糊涂了。我猜你想要int[] A的其实是一样的int* A。但是你必须为数组分配一些内存或用给定的大小初始化它。

于 2012-04-04T07:06:43.480 回答
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);
于 2012-04-04T07:07:09.567 回答
1

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

它在抱怨你的 for 循环。length永远不会被初始化,所以无论如何你都会发送一个指向垃圾数据的指针(或者它永远不会填充从文件读取)。

i < length无效(在这个意义上),因为您正在将int值与地址或int *(这没有意义)进行比较。你可能是说i < *length;因为length是一个指针,需要取消引用它的实际值。

于 2012-04-04T07:07:13.423 回答
1

调用您的函数时,您应该提供地址参考,例如 &A 和 &B

这就是您应该如何正确阅读文本文件的方式:)

FILE *file = fopen(file_name, "r");
while(file != EOF){
    fscanf(...)
}

编辑

您不需要使用双指针。main()只需以整数初始化Int A,B并为您的方法提供地址。

于 2012-04-04T07:07:47.660 回答
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作为数组吗?

例如改变:

int *A; int *B; int length;

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

或类似的东西。(一旦您知道需要多少数组,也许可以动态分配数组 - 或者根据需要分配它们malloc(3)并增加它们realloc(3)。)

于 2012-04-04T07:10:46.330 回答