2013-04-05 59 views
0
int main() 
{ 
    char a[100][100]; 
    int i = 0, k = 0; 
    FILE* file = fopen("A:/input.txt", "r"); 
    if(file == NULL){ 
     perror("Error opening file !\n"); 
    } else { 
     while(! feof(file)){ 
      fscanf(file, "%d;%s\n", &i, a[i]); 
     } 
    } 
    for(; k < i; ++k){ 
     printf("%d -> %s\n", k, a[k]); 
    } 
    return 0; 
} 

我有这个代码的工作片,我试图实现它作为这样一个功能:如何从文件函数中进行工作读取?

int reader(char b[20], char *a[100][100], int *i){ 
    int j = 0; 
    FILE* file = fopen(b, "r"); 
    if(file == NULL){ 
     perror("Error opening file !\n"); 
    } else { 
     while(! feof(file)){ 
      fscanf(file, "%d;%s\n", j, a[j]); 
     } 
    } 
*i = j; 
return 0;} 

,并从主的电话:

char a[100][100]; 
int i = 0; 
reader("Type.txt", &a, &i); 

但是当我使用函数,代码在fscanf调用时崩溃。 任何ideea我如何使这项工作或如何创建一个函数,从文件中逐行读取并创建一个数组在这种形式:array [0] = firstline,array [1] = secondline等

+2

这里有无数的问题。 'reader()'接口中的'char * a [100] [100]'可能不是您想要的或意思;那么你没有正确使用它。该设计只能读取最多100行,并且只有每行少于100个字符。 'while(!feof(file))'符号是Pascal编程的一个(糟糕!)解酒;这是不好的C代码,永远。你不检查'fscanf()'的返回值。你不会在扫描循环中增加'j',所以你一直覆盖同一行。你不关闭在'reader()'中打开的文件。在'main()'中,你不会在循环中增加'i'。 – 2013-04-05 16:39:22

+0

在我正在阅读数据的文件是存储这样的ID;名称,这就是为什么我不增加我因为我直接从文件读取它,我读取ID并将名称放入数组[id]。 – CristiDeac 2013-04-05 20:24:14

+0

你不能那样做。在调用'scanf()'之前确定'''用于索引'array'的值。然后你用读取更新'j'。下一个输入进入前一个输入的索引读取。我确实在想,这是不是你想要的,但我想“不,不可能,可以吗?”你从编译器得到了多少警告?你应该从'reader()'函数中得到一些(我得到两个:'格式'%d'需要'int *'类型的参数,但参数3的类型'int'和'格式'%s'预计类型'char *'的参数,但参数4的类型为'char **')。 – 2013-04-05 21:15:22

回答

1

你在main()函数中用变量i正确地做了它,但是当你将它移动到某个函数时,你忘记了一个符号。你需要的j地址传递给fscanf()

fscanf(file, "%d;%s\n", &j, a[j]); 
1

首先,你必须在&添加到j在这一行

fscanf(file, "%d;%s\n", j, a[j]); 

应该

fscanf(file, "%d;%s\n", &j, a[j]); 

也输入函数数组不应该包含星号*

int reader(char b[20], char a[100][100], int *i){ 
+0

谢谢,最好的解决方案!如果我只添加&在j尝试将数据放在4个字节中,并在字符串a中的4个位置写入一个条目,所以删除*是必要的。 再次感谢! – CristiDeac 2013-04-05 20:27:24