在C范围内使用简单的文件I / O指示函数超出其范围的函数?

时间:2016-02-09 22:11:00

标签: c pointers

是否可以在其范围之外使用指针表示法?

这是我的主要内容:

int main(){
    int number[15];
    readNumbers();
    return 0;
}

这是我的readNumbers()函数:

void readNumbers() {
    FILE *fp;
    fp = fopen("/Users/Documents/testNumbers.txt", "r"); 
    if (fp == NULL) {
        printf("File could not be loaded!");
        exit(0);
    }
    if (fp != NULL) {
        int c;
        while ((c = fgetc(fp)) != EOF) {
            putchar(c);
        }
        fclose(fp);
    }
    return 0;
}

我试图让我的readNumbers()函数将testNumbers.txt中的数字添加到我的main(int* num[15])中类型为int的15的数组中。

这会有用吗?:

int num[15]; // This will be in the main

&安培;&安培;

numRef *ip; // This will be in the main also as a pointer variable declaration

然后在我的int c;函数中代替readScores()而不是这样?:

ip = int* num[15]; // The variable that will store the address of int in pointer variable

非常非常混淆指针表示法。帮助太棒了!谢谢!

3 个答案:

答案 0 :(得分:1)

您无法直接访问其他功能中的变量。有三种方法可以做你想要的。只有第三个被普遍认为是一个好主意。

  1. 使数字数组全局化,以便可以从两个函数中使用它们:

    int number[15];
    
    int main() {
        readNumbers(); // side effect: fills the global number array
        // use the filled global number array here
        return 0;
    }
    
    void readNumbers() {  // side effect: fills the global number array
        FILE *fp;
        fp = fopen("/Users/Documents/testNumbers.txt", "r"); 
        if (fp == NULL) {
            printf("File could not be loaded!");
            exit(0);
        }
        if (fp != NULL) {
            int c;
            while ((c = fgetc(fp)) != EOF) {
                // fill the global numbers array with data
                putchar(c);
            }
            fclose(fp);
        }
        return 0;
    }
    
  2. 在readNumbers中声明一个静态数字数组并返回它:

    int main() {
        int* number = readNumbers();
        // use the filled number array here
        return 0;
    }
    
    int* readNumbers() {
        static int number[15];
        FILE *fp;
        fp = fopen("/Users/Documents/testNumbers.txt", "r"); 
        if (fp == NULL) {
            printf("File could not be loaded!");
            exit(0);
        }
        if (fp != NULL) {
            int c;
            while ((c = fgetc(fp)) != EOF) {
                // fill the static numbers array with data
                putchar(c);
            }
            fclose(fp);
        }
        return number;
    }
    
  3. 将数组数组传递给readNumbers,以便填充:

    int main() {
        static int number[15];
        readNumbers(number);
        // use the filled number array here
        return 0;
    }
    
    void readNumbers(int* number) {
        FILE *fp;
        fp = fopen("/Users/Documents/testNumbers.txt", "r"); 
        if (fp == NULL) {
            printf("File could not be loaded!");
            exit(0);
        }
        if (fp != NULL) {
            int c;
            while ((c = fgetc(fp)) != EOF) {
                // fill the passed in numbers array with data
                putchar(c);
            }
            fclose(fp);
        }
        return 0;
    }
    

答案 1 :(得分:0)

一种简单的方法是将指针传递给数字数组作为函数的参数:

int main(){
    int number[15];
    readNumbers(numbers, 15);  //<======
    return 0;
}

并在您的函数中使用此参数:

void readNumbers(int *ip, size_t ipmax) {
   ...
}

您可以在函数ip[xxx]中使用它,就像它是一个数组一样。唯一的想法是它的大小在功能中是未知的。这就是我建议将大小作为额外参数传递的原因。

另一种方法是使用向量代替,并通过引用传递它:

    vector<int> number(15);    // a vector of 15 elements.  it can increase further  
    readNumbers(numbers, 15);  //<======

...

void readNumbers(vector<int> &v) {  // the size if v.size()
   ...
}

答案 2 :(得分:0)

这是使用动态内存分配实现readnums的方法;也就是说,调用者只是传递一个指针,当函数返回时,它将包含文件中的数字。这样,您就不需要对代码中的限制进行硬编码。

#define INITALLOC    16
#define STEP          8
typedef long ssize_t;
ssize_t readnums(FILE *fp, int **arr)
{
    size_t i, nalloced; /* #ints read and #ints malloced, respectively */
    int *tmp;

    /* allocate INITALLOC ints on the heap. */
    if ((*arr = malloc(INITALLOC * sizeof (int))) == NULL)
        return -1;
    nalloced = INITALLOC;
    /* fscanf reads the next int. It returns 1 if an int was found */
    for (i = 0; fscanf(fp, "%d", *arr + i) == 1; ++i)
        if (i == nalloced - 1) { /* if we run out of space, alloc more */
            /* store it in a temporary, otherwise previous data is lost on 
               failure */
            if ((tmp = realloc(*arr, (nalloced += STEP)*sizeof(int)))==NULL)
                return -1;
            *arr = tmp;
        }

    /* return #ints read */
    return i;
}

请注意,调用者必须释放内存:

int *arr;
if (readnums(fp, &arr) == -1)
    fprintf(stderr, "Error\n");
else {
    /* ... do stuff ... */
    free(arr);
}