2014-03-18 27 views
1

我有下面的代码:`读一个动态数组从一个文件功能

#include <stdio.h> 
#include <stdlib.h> 

void load_from_file(int A[], int *n); 

int main() 
{ 
    int *A; 
    A = (int*)malloc(0); 
    int count = 0; 
    int i; 

    load_from_file(A, &count); 

    for(i = 0; i < count; i++) 
    { 
     printf("A[%d]=%d ", i, A[i]); 
     printf("\n"); 
     printf("&A[%d]=%p \n\n", i, &A[i]); 
    } 

    return 0; 
} 

void load_from_file(int A[], int *n) 
{ 
    FILE* fp; 
    int temp, i; 

    fp = fopen("data.txt", "r"); 
    if (fp == NULL) 
    { 
     printf("error!!"); 
     exit (1); 
    } 

    fscanf(fp, "%d", &temp); 
    *n = temp; 

    A = (int*) realloc(A, temp * sizeof(int)); 
    if (*A == NULL) 
    { 
     printf("error realloc!!"); 
     exit(1); 
    } 

    for(i = 0; i < temp; i++) 
    { 
     fscanf(fp, "%d", &A[i]); 
    } 

    for(i = 0; i < temp; i++) 
    { 
     printf("A[%d]=%d ", i, A[i]); 
     printf("\n"); 
     printf("&A[%d]=%p \n\n", i, &A[i]); 
    } 

    fclose(fp); 
} 

我想读取文本文件到一个数组。 文件的第一行有数组元素的个数,第二行是数字元素。 我们通过realloc创建数组。 但是出了点问题..... 我有一些补丁,打印数组元素的地址。

但可惜的是,他们是不同的(不是所有的时间)的函数中,函数外,虽然数组通过引用传递(我想...)

请告诉我哪里是错误,我该如何解决这个问题。

在此先感谢...

迪米特里

+0

你能给我一点data.txt文件,几个样本? – Claudiordgz

+1

您正在向函数传递一个指针,但您需要将指针传递给该函数的指针,以便该函数可以修改调用代码中的值('main()'),或者从函数返回指针。 –

+0

for examle:第一行:3(表示3个元素),即n = 3,创建一个包含3个元素的数组。第二行:2 3 4.我们应该有A [0] = 2,A [1] = 3,A [2] = 4。这发生在函数内部,但功能外有完全不同的值和不同的地址... – user3434833

回答

1

电话:

int *A = load_from_file(&count); 

功能:

int *load_from_file(int *n) 
{ 
    FILE* fp; 
    int temp,i; 
    int *A = 0; 

    fp=fopen("data.txt","r"); 
    if (fp==NULL){fprintf(stderr, "error!!\n");exit (1);} 

    fscanf(fp,"%d",&temp); 
    *n=temp; 
    A = (int*) realloc(A,temp * sizeof(int)); 
    if (A == NULL) {fprintf(stderr, "error realloc!!\n");exit(1);} 
    for(i=0;i<temp;i++) 
     fscanf(fp, "%d",&A[i]); 
    for(i=0;i<temp;i++) 
    { 
     printf("A[%d]=%d ",i,A[i]); 
     printf("\n"); 
     printf("&A[%d]=%p \n\n",i,&A[i]); 
    } 
    fclose(fp); 
    return A; 
} 

这是一组变化的完全最小;代码需要更多的工作。特别是,fscanf()调用应该被错误检查。分配测试中有一个微妙而重要的变化:if (A == NULL)而不是原来的if (*A == NULL)


随着有点较为完整的错误检查:

int *load_from_file(int *n) 
{ 
    FILE *fp; 
    int temp, i; 
    int *A = 0; 
    const char file[] = "data.txt"; 

    fp = fopen(file, "r"); 
    if (fp == NULL) 
    { 
     fprintf(stderr, "Failed to open file %s for reading\n", file); 
     exit(1); 
    } 

    if (fscanf(fp, "%d", &temp) != 1) 
    { 
     fprintf(stderr, "Failed to read number of entries\n"); 
     exit(1); 
    } 
    *n = temp; 
    A = (int *) realloc(A, temp * sizeof(int)); 
    if (A == NULL) 
    { 
     fprintf(stderr, "Failed to reallocate %zu bytes of memory\n", 
       temp * sizeof(int)); 
     exit(1); 
    } 
    for (i = 0; i < temp; i++) 
    { 
     if (fscanf(fp, "%d", &A[i]) != 1) 
     { 
      fprintf(stderr, "Failed to read entry number %d\n", i); 
      exit(1); 
     } 
    } 
    for (i = 0; i < temp; i++) 
     printf("A[%d]=%d: &A[%d]=%p\n", i, A[i], i, &A[i]); 
    fclose(fp); 
    return A; 
} 

我有,我用这将错误从4线处理降低到每1行出现错误的错误报告功能库。我强烈建议你自己创建和使用这样一个库。

+0

非常感谢我的朋友!所以你说,写一个像void readFromFile(int ** A,int * next)这样的函数是不可能的。 ?或者它会很容易出错? – user3434833

+0

有可能使用接口'void readFromFile(int ** A,int * next);'但我通常更愿意返回指针传入指针的指针。在实践中,它没有什么重大区别。你可能会考虑'int readFromFile(char const * filename,int ** A,int * next);'它将文件名传递给函数并返回一个状态(OK为0,其他值表示失败),所以你可以测试成功或失败,而不是像目前的代码一样终止程序。您可以在我的代码版本中返回空指针。很多的可能性... –

+0

谢谢!你很棒! – user3434833