#include <stdio.h>
 #include <stdlib.h>
 typedef struct aluno{
                 char cabecalho[60];
                 char info[100];
                 int n_alunos;
                 char dados[100];
                 char curso[100];
                 int numero;
                 char nome[100];
                 char e_mail[100];
                 int n_disciplinas;
                 int nota;
                 }ALUNO;

void cabclh(ALUNO alunos[],int a){
   FILE *fp;
   int i;
   for(i=0;i<100;i++){
      fp=fopen("trabalho.txt","r");

       if(fp==NULL){
           printf("Erro ao abrir o ficheiro\n");
       }
       while(!feof(fp)){
           fgets(alunos[i].cabecalho,60,fp);
           printf("%s\n",alunos[i].cabecalho);
       }
    }
    fclose(fp);
}


这是怎么了

主要:

int main(int argc, char *argv[]){
   ALUNO alunos[100];
   int aluno;
   int b;

   cabclh(aluno,b);

   system("PAUSE");
   return 0

最佳答案

这里有很多问题。

传递给cabclh的第一个参数的类型错误:

void cabclh(ALUNO alunos[],int a);
: :
int aluno;
cabclh(aluno,b);


如果您无法打开文件,则可能应该退出该函数(或其他一些错误处理):

if (fp==NULL){
    printf("Erro ao abrir o ficheiro\n");
    return; // <- Added
}


无需打开文件一百次。如果常规文件第一次没有打开,则可能根本不会打开(尽管在某些情况下可能会发生这种情况)。此特定段将导致文件句柄浪费:

for(i=0;i<100;i++){
   fp=fopen("trabalho.txt","r");
}


此外,它将每次将文件指针重置为文件的开头。



如果您打算从该文件中读取多达100个项目以存储到您的阵列中,建议您从以下内容开始:

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

typedef struct aluno{
    char cabecalho[60];
    char info[100];
    int n_alunos;
    char dados[100];
    char curso[100];
    int numero;
    char nome[100];
    char e_mail[100];
    int n_disciplinas;
    int nota;
} ALUNO;

void cabclh (ALUNO alunos[]) {
    FILE *fp;
    int i;

    // Initialise all elements to indicate no data.

    for (i = 0; i < 100; i++)
        alunos[i].cabecalho[0] = '\0';

    // Open the file, returning if not there.

    fp = fopen ("trabalho.txt","r");
    if (fp == NULL) {
        printf("Erro ao abrir o ficheiro\n");
        return;
    }

    // Only allow up to 100 elements.

    for (i = 0; i < 100; i++) {
        // Only read and load if more to go.

        if (!feof(fp)) {
            // Read the line and strip off newline character.

            fgets (alunos[i].cabecalho,60,fp);
            if (alunos[i].cabecalho[strlen(alunos[i].cabecalho)-1] == '\n')
                alunos[i].cabecalho[strlen(alunos[i].cabecalho)-1] = '\0';
            printf ("%s\n", alunos[i].cabecalho);
        }
    }

    // Close the file.

    fclose (fp);
}

int main (int argc, char *argv[]) {
    ALUNO alunos[100];

    cabclh(alunos);

    system("PAUSE");
    return 0;
}


它成功读取了我创建的测试文件。现在可能是您的输入文件更加复杂,仅100个字符串要加载到cabecelho中,但是上面的代码是一个不错的开始,显示了控制逻辑。广告采用不同的行格式只会更改每行的读取方式,而不会更改其周围的循环。

而且,如果您希望能够处理任意数量的行,我将不再使用数组,而是使用更具扩展性的数据结构。但是,第一次尝试,您正在做出正确的选择,以使其保持简单。

关于c - C编程fopen,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2679734/

10-11 16:47