2012-04-04 177 views
1

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

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

的文件格式是

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; 
} 
+0

这真的是错误信息?它会发生什么? – 2012-04-04 07:05:53

+0

错误消息表明您正在尝试乘以两个“int *”,例如'main'中的'A * B'。你不会显示任何线路。无论如何,将它改为'(* A)*(* B)'。 – Jon 2012-04-04 07:06:54

+0

Line:nt * A; int * B; int长度; – blitzkriegz 2012-04-04 07:07:22

回答

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),如果你需要。)

+0

在这里,我可以从文件中读取它后才知道长度。我不能将分配推迟到函数内部(阅读长度后)吗? – blitzkriegz 2012-04-04 07:13:09

+0

如果您想让它两次通过,您可以通读(并放弃)所有输入,计算所需的大小,分配数组,然后将所有数据重新读入数组。但更常见的是(想想从管道或套接字获取输入,或者不想从磁盘重新读取数据)是进行初始分配,填充一些数组,然后在数组清空后再放大数组你需要分配更多的空间。 – sarnold 2012-04-04 07:14:47

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

    return 0; 
} 

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

我不确定这是否是问题。但试试看吧。

对不起,我被int指针弄糊涂了。我想你想要的是int[] A实际上与int* A相同。但是你必须为数组分配一些内存或者用给定的大小来初始化它。

+0

我需要A和B作为整数(缓冲区)数组,但不是整数 – blitzkriegz 2012-04-04 07:10:25

+0

已更新的答案 - 但也有其他人为您提供工作代码。 – Tarion 2012-04-04 07:12:00

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 

你可以这样改变的所有AB主要

int* A; int* B; int length; 
ReadFromFile("input.txt", &A, &B, &length); 
+0

如何在这里调用ReadFromFile?我的意思是我需要把地址的地址通过吗? – blitzkriegz 2012-04-04 07:15:11

+0

我将它添加到帖子中。 – HWende 2012-04-04 07:24:47

1

第一是指向垃圾的指针,如果您确实想要存储某些内容(或期望出现分段错误或内存损坏),则需要分配空间。

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

i < length由于您将int值与地址或int *(这没有意义)进行比较,因此无效(从这个意义上说)。你可能意思是i < *length;因为length是一个指针,需要对其实际值进行解除引用。

+0

是的,我明白这一点。我需要从文件中读取长度来分配空间。怎么做? – blitzkriegz 2012-04-04 07:08:53

+0

您可以使用lseek并转到SEEK_END查找以字节为单位的文件长度,并将其用作估计或分配一些空间并在用完时动态调用realloc并动态扩展空间。 – 2012-04-04 07:10:53

1

当你调用你的函数时,你应该给出一个地址引用,例如,& A和&乙

而且这是你应该如何恰当地阅读文本文件:)

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

编辑

你不需要使用双指针。只需初始化main()整数Int A,B并给你的方法他们的地址。

+1

请注意'int A,B'不会完全切断它 - 闪电想要数据_array_。 +1是用于阅读惯用文件的文件,难以正确读取,从已知的惯用配方开始非常值得。 :) – sarnold 2012-04-04 07:17:41