#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/