通过main调用另一个函数来打开文件

时间:2016-03-11 00:29:45

标签: c function pointers function-pointers

我想知道是否有任何方法可以使用main调用另一个函数来打开argv []中包含的文件。我主要有两个功能。一个叫做ReadMaze(它会在文本文件中读取并进行错误检查)。另一个叫PrintMaze,这个打印出沿着另一个函数内部读取的迷宫边框。那么我需要做的是能够打开txt文件并让它实际上能够通过它们并打印出来。

添加了代码以显示功能及其正在执行的操作。

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

typedef struct QQNode {

} QUEUE;

//typedef QUEUE *PQQNode;

typedef struct CEnode {
    char cglyph;
    char cDir;
    short fVisible;  //boolean
    int iDistance;   //not needed
    QUEUE *pQXnext;        
} CELL;

typedef struct MQnode {
    CELL **ppCE;
    int iRows, iCols, iGoals, iStarts;
} MAZE;

MAZE *ReadMaze(FILE *fpInput) {
    int j, k, c, g, s;
    MAZE *pMQRet;

    if ((MAZE *)0 == (pMQRet = malloc(sizeof(MAZE)))) {
        exit(-1);
    }

    if (2 != fscanf(fpInput, " %d,%d\n", &pMQRet->iRows, &pMQRet->iCols)) {
        exit(-1);
    }

    if (2 > pMQRet->iRows || 2 > pMQRet->iCols) {
        exit(-1);
    }

    if ((CELL **)0 == (pMQRet->ppCE = malloc(sizeof(CELL *) * pMQRet->iRows))) {
        exit(-1);
    }

    // initialize goals and starts
    for (g = 0; g < pMQRet->iRows; g++) {
        //Trying to initialize the starts and goals right here
    }

    for (j = 0; j < pMQRet->iRows; j++) {
        if ((CELL*)0 == (pMQRet->ppCE[j] = malloc(sizeof(CELL) * pMQRet->iCols + 1))) {
            exit(-1);
        }

        for (k = 0; k < pMQRet->iCols + 1; k++) {
            if (EOF == (c = fgetc(fpInput))) {
                exit(-1);
            }
            pMQRet->ppCE[j][k].cglyph = c;
        }
    }
    return pMQRet;
}

void PrintMaze(FILE *fpout, MAZE *pMQThis) {
    int j, k, l;
    CELL *pCE;

    if ((MAZE *)0 == pMQThis) {
        exit(EXIT_FAILURE);
    }

    for (l = 0; l < pMQThis->iCols + 2; l++) {
        fputc('-', fpout);
    }

    for (j = 0; j < pMQThis->iRows; j++) {
        pCE = pMQThis->ppCE[j];

        fputc('|', fpout);

        for (k = 0; k < pMQThis->iCols; k++) {
            fputc(pCE[k].cglyph, fpout);
        }

        fputc('|', fpout);
        fputc('\n', fpout);
    }

    for (l = 0; l < pMQThis->iCols + 2; l++) {
        fputc('-', fpout);
    }
}

int main(int argc, const char *argv[]) {

} // end of main

1 个答案:

答案 0 :(得分:0)

您可以从main调用任何函数并传递单个命令行参数argv[i]或数组本身argv,甚至是指向其中一个元素的指针。只需定义函数以采用适当的参数类型。

可以通过这种方式从main调用您的函数:

#include <errno.h>

int main(int argc, char *argv[]) {
    FILE *fpin = stdin;
    FILE *fpout = stdout;
    MAZE *maze;

    if (argc > 1) {
        fpin = fopen(argv[1], "r");
        if (fpin == NULL) {
            fprintf(stderr, "cannot open input file %s: %s\n", argv[1], strerror(errno));
            exit(1);
        }
    }
    if (argc > 2) {
        fpout = fopen(argv[2], "w");
        if (fpout == NULL) {
            fprintf(stderr, "cannot open output file %s: %s\n", argv[2],  strerror(errno));
            exit(1);
        }
    }
    maze = ReadMaze(fpin);
    PrintMaze(fpout, maze);
    fclose(fpin);
    fclose(fpout);
    return 0;
}