2015-07-22 2 views
0

Я пытаюсь создать программу, которая может работать с несколькими разными файлами одновременно. Моя идея состоит в том, чтобы сделать массив из 20 FILE *, чтобы, если когда-либо я прихожу к этому пределу, чтобы закрыть один из них и открыть новый запрошенный файл. Для этой цели я подумал о функции, которая выбирает опцию и вызывает другую, что делает задачу сохранения (записи), закрытия и открытия. После полутора недель поиска в Интернете и внесения некоторых доказательств я сделал две версии, которые, похоже, работают: одна с файлом *, а другая с файлом **.Массив FILE * через функции: FILE * или 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; 
} 

}

Большое спасибо заранее.

+0

Скомпилируйте и отлаживайте, чтобы увидеть ошибки. – ameyCU

+0

Вы запрашиваете обзор кода, который поможет вам диагностировать потенциальные проблемы? –

+0

Я не могу представить, почему вы использовали бы для этого '(ФАЙЛ **) []'. A '(FILE *) []' должно быть вполне адекватным. Что касается изучения вашего кода на наличие проблем, вы отправили их в неподходящее место. Вы хотите http://codereview.stackexchange.com/. –

ответ

2

Один дескриптор файла является указателем на FILE, то есть FILE *. Поскольку вам нужен массив этих элементов FILE *, указатель на массив равен FILE **arr, что эквивалентно FILE *arr[] при использовании в качестве типа параметра для функции.

+1

Это эквивалентно, когда происходят преобразования между массивами и указателями, в противном случае они представляют собой два разных типа. – edmz