FILE *到函数的数组:FILE *或FILE **?

时间:2015-07-22 17:48:55

标签: c file pointers

我正在尝试制作一个可以同时处理多个不同文件的程序。我的想法是创建一个20 FILE *的数组,以便,如果我达到这个限制,能够关闭其中一个并打开所请求的新文件。     出于这个目的,我在一个选择一个选项的函数中进行了思考,然后调用另一个选项来完成保存(写入),关闭和打开的工作。     经过半个小时的网上搜索并做了一些证明,我已经制作了两个似乎有效的版本:一个是文件*,另一个是文件**。

我的问题是:如果他们中的一些人在通过这两个功能时遇到了我无法检测到或错误使用指针的错误。

(我显示的代码依次有两个版本的两个版本。)

MyProgram() {

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

/* The contents of myFile1a.dat, myFile2b.dat,... are just 5 ints. */


/* Version without pointer to pointer. */
void fReadFile(FILE* pfFile[]) {
    int i = 0, j = 0;
    int iNums[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    int iNums2[15] = {5001, 5002, 5003, 5004, 5005, 2033, 2066, 2099, 2133, 2166, 3001, 3002, 3003, 3004, 3005};
    char cNameFile4d[32] = "myFile4d.dat", cNameFile5e[32] = "myFile5e.dat";   
    char cNameFile6f[32] = "myFile6f.dat";
    char cNameFile[32] = {" "};
    int iResultFclose = 0;

    for(i=0; i<5; i++) {
        fread(&iNums[i], 4, 1, pfFile[0]);
        printf("\n%d",iNums[i]);
    }
    for(i=5; i<10; i++) {
        fread(&iNums[i], 4, 1, pfFile[1]);
        printf("\n%d",iNums[i]);
    }
    for(i=10; i<15; i++) {
        fread(&iNums[i], 4, 1, pfFile[2]);
        printf("\n%d", iNums[i]);
    }

    iResultFclose = fclose(pfFile[0]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose(pfFile[1]);
    if (iResultFclose != 0)
        puts("Error closing the file 1.");
    iResultFclose = fclose(pfFile[2]);
    if (iResultFclose != 0)
        puts("Error closing the file 2.");

    strcpy(cNameFile, cNameFile4d);
    pfFile[0] = fopen(cNameFile, "wb");
    for(i=0; i<5; i++)
        fwrite(&iNums2[i], 4, 1, pfFile[0]);
    strcpy(cNameFile, cNameFile5e);
    pfFile[1] = fopen(cNameFile, "wb");
    for(i=5; i<10; i++)
        fwrite(&iNums2[i], 4, 1, pfFile[1]);
    strcpy(cNameFile, cNameFile6f);
    pfFile[2] = fopen(cNameFile, "wb");
    for(i=10; i<15; i++)
        fwrite(&iNums2[i], 4, 1, pfFile[2]);

    iResultFclose = fclose(pfFile[0]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose(pfFile[1]);
    if (iResultFclose != 0)
        puts("Error closing the file 1.");
    iResultFclose = fclose(pfFile[2]);
    if (iResultFclose != 0)
        puts("Error closing the file 2.");

    strcpy(cNameFile, cNameFile4d);
    pfFile[0] = fopen(cNameFile, "rb");
    strcpy(cNameFile, cNameFile5e);
    pfFile[1] = fopen(cNameFile, "rb");
    strcpy(cNameFile, cNameFile6f);
    pfFile[2] = fopen(cNameFile, "rb");

    for(i=0; i<5; i++) {
        fread(&iNums[i], 4, 1, pfFile[0]);
        printf("\n%d",iNums[i]);
    }
    for(i=5; i<10; i++) {
        fread(&iNums[i], 4, 1, pfFile[1]);
        printf("\n%d",iNums[i]);
    }
    for(i=10; i<15; i++) {
        fread(&iNums[i], 4, 1, pfFile[2]);
        printf("\n%d", iNums[i]);
    }

    iResultFclose = fclose(pfFile[0]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose(pfFile[1]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose(pfFile[2]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
}

/* Version with pointer to pointer. */
void fReadFile(FILE** pfFile[]) {
    int i = 0, j = 0;

    int iNums[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    int iNums2[15] = {5001, 5002, 5003, 5004, 5005, 2033, 2066, 2099, 2133, 2166, 3001, 3002, 3003, 3004, 3005};
    char cNameFile4d[32] = "myFile4d.dat", cNameFile5e[32] = "myFile5e.dat", cNameFile6f[32] = "myFile6f.dat";
    char cNameFile[32] = {" "};
    int iResultFclose = 0;

    for(i=0; i<5; i++) {
        fread(&iNums[i], 4, 1, (*pfFile)[0]);
        printf("\n%d",iNums[i]);
    }
    for(i=5; i<10; i++) {
        fread(&iNums[i], 4, 1, (*pfFile)[1]);
        printf("\n%d",iNums[i]);
    }
    for(i=10; i<15; i++) {
        fread(&iNums[i], 4, 1, (*pfFile)[2]);
        printf("\n%d", iNums[i]);
    }

    iResultFclose = fclose((*pfFile)[0]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose((*pfFile)[1]);
    if (iResultFclose != 0)
        puts("Error closing the file 1.");
        iResultFclose = fclose((*pfFile)[2]);
    if (iResultFclose != 0)
        puts("Error closing the file 2.");

    strcpy(cNameFile, cNameFile4d);
    (*pfFile)[0] = fopen(cNameFile, "wb");
    for(i=0; i<5; i++)
        fwrite(&iNums2[i], 4, 1, (*pfFile)[0]);
    strcpy(cNameFile, cNameFile5e);
    (*pfFile)[1] = fopen(cNameFile, "wb");
    for(i=5; i<10; i++)
        fwrite(&iNums2[i], 4, 1, (*pfFile)[1]);
    strcpy(cNameFile, cNameFile6f);
    (*pfFile)[2] = fopen(cNameFile, "wb");
    for(i=10; i<15; i++)
        fwrite(&iNums2[i], 4, 1, (*pfFile)[2]);

    iResultFclose = fclose((*pfFile)[0]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose((*pfFile)[1]);
    if (iResultFclose != 0)
        puts("Error closing the file 1.");
    iResultFclose = fclose((*pfFile)[2]);
    if (iResultFclose != 0)
        puts("Error closing the file 2.");

    strcpy(cNameFile, cNameFile4d);
    (*pfFile)[0] = fopen(cNameFile, "rb");
    strcpy(cNameFile, cNameFile5e);
    (*pfFile)[1] = fopen(cNameFile, "rb");
    strcpy(cNameFile, cNameFile6f);
    (*pfFile)[2] = fopen(cNameFile, "rb");

    for(i=0; i<5; i++) {
        fread(&iNums[i], 4, 1, (*pfFile)[0]);
        printf("\n%d",iNums[i]);
    }
    for(i=5; i<10; i++) {
        fread(&iNums[i], 4, 1, (*pfFile)[1]);
        printf("\n%d",iNums[i]);
    }
    for(i=10; i<15; i++) {
        fread(&iNums[i], 4, 1, (*pfFile)[2]);
        printf("\n%d", iNums[i]);
    }

    iResultFclose = fclose((*pfFile)[0]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose((*pfFile)[1]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose((*pfFile)[2]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
}

/* Version without "&" in the caller. */
void fOptions(FILE* pfFileOpc[], int option) {
    int i = 0;
    switch (option)
    {
        case 1: {fReadFile(pfFileOpc); break;}
        case 2: {printf("\nHello!\n"); break;}
        default: break;
    }
}

/* Version with "&" in the caller. */
void fOptions(FILE* pfFileOpc[], int option) {
    int i = 0;
    switch (option)
    {
        case 1: {fReadFile(&pfFileOpc); break;}
        case 2: {printf("\nHello!\n"); break;}
        default: break;
    }
}

int main() {
    FILE *pFile[3];
    int i = 0, j = 0, option = 0, iResultFclose = 0;

    char cNameFile[32] = {" "};
    char cNameFile1a[32] = "myFile1a.dat", cNameFile2b[32] = "myFile2b.dat";
    char cNameFile3c[32] = "myFile3c.dat", cNameFile4d[32] = "myFile4d.dat";
    char cNameFile5e[32] = "myFile5e.dat",  cNameFile6f[32] = "myFile6f.dat";

    int iNums[15] = {2001, 2002, 2003, 2004, 2005, 2033, 2066, 2099,  2133, 2166, 3001, 3002, 3003, 3004, 3005};
    int iNums2[15] = {5001, 5002, 5003, 5004, 5005, 2033, 2066, 2099,  2133, 2166, 3001, 3002, 3003, 3004, 3005};

    strcpy(cNameFile, cNameFile1a);
    pFile[0] = fopen(cNameFile, "rb");
    if (!pFile[0])
        puts("Error opening the file1a");
    strcpy(cNameFile, cNameFile2b);
    pFile[1] = fopen(cNameFile, "rb");
    if (!pFile[1])
        puts("Error opening the file2b");
    strcpy(cNameFile, cNameFile3c);
    pFile[2] = fopen(cNameFile, "rb");
    if (!pFile[2])
        puts("Error opening the file3c");

    printf("\nWrite an option: \n");
    scanf("%d", &option);
    fOptions(pFile, option);

    puts("\n\nAnd we foooooolow....... \n\n");

    strcpy(cNameFile, cNameFile1a);
    pFile[0] = fopen(cNameFile, "rb");
    if (!pFile[0])
        puts("Error opening the file1a");
    strcpy(cNameFile, cNameFile2b);
    pFile[1] = fopen(cNameFile, "rb");
    if (!pFile[1])
        puts("Error opening the file2b");
    strcpy(cNameFile, cNameFile3c);
    pFile[2] = fopen(cNameFile, "rb");
    if (!pFile[2])
        puts("Error opening the file3c");

    for(i=0; i<5; i++) {
        fread(&iNums[i], 4, 1, pFile[0]);
        printf("\n%d",iNums[i]);
    }
    for(i=5; i<10; i++) {
        fread(&iNums[i], 4, 1, pFile[1]);
        printf("\n%d",iNums[i]);
    }
    for(i=10; i<15; i++) {
        fread(&iNums[i], 4, 1, pFile[2]);
        printf("\n%d", iNums[i]);
    }

    iResultFclose = fclose(pFile[0]);
    if (iResultFclose != 0)
        puts("Error closing the file 0.");
    iResultFclose = fclose(pFile[1]);
    if (iResultFclose != 0)
        puts("Error closing the file 1.");
    iResultFclose = fclose(pFile[2]);
    if (iResultFclose != 0)
        puts("Error closing the file 2.");

    return 0;
}

}

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

单个文件句柄是指向 <form id="form1" runat="server"> <div> <asp:DropDownList ID="ddlCityName" runat="server" DataTextField="City" DataValueField="City" class="ddlClone"></asp:DropDownList> <input type="button" id="btnClone" value="Clone Dropdown" /> </div> <div id="target"> </div> </form> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $('#btnClone').click(function () { var original = $('select.ddlClone:eq(0)'); var allSelects = $('select.ddlClone'); var clone = original.clone(); $('option', clone).filter(function (i) { return allSelects.find('option:selected[value="' + $(this).val() + '"]').length; }).remove(); $('#target').append(clone).append('<br /><br /><br />'); }); </script> 的指针,即FILE。由于您需要这些FILE *元素的数组,因此指向数组的指针为FILE *,当用作函数的参数类型时,它等效于FILE **arr