C语言从文件中读取并写入结构体数组
新建一个文件,包含若干条学生信息,将它们读入到一个数组,然后再把数组输出到另一个文件。文件名是通过命令行参数传递的。
该程序涉及到main()函数传参的问题,请查看:C语言mian()函数详解
例如,我编译后的程序在 E:\cDemo\Debug\ 文件,需要操作的两个文件位于 D 盘根目录,分别为 input.txt 和 output.txt,output.txt 为空,input.txt 的内容为:
cyuyan 45 20 30
see.xidian.edu.cn/cpp/ 35 90 100
tom 89 99 88
需要在命令行进行如下操作:
打开 output.txt,发现与 input.txt 的内容一样。
该程序涉及到main()函数传参的问题,请查看:C语言mian()函数详解
#include <stdio.h> #define SIZE 10 #define NAMESIZE 25 typedef struct { char name[NAMESIZE]; int midterm; int final; int homeworks; } student; // n 为数组 a 的元素个数,filename 为写入的文件名 void writeStudentArray(char filename[], student a[], int n) { FILE *fd; // filename 的文件描述符 int i; if(n<=0) return; if((fd=fopen(filename,"w"))==NULL){ perror("fopen"); exit(1); } for (i=0;i<n;i++){ fprintf(fd,"%s %d %d %d\n", a->name, a->midterm, a->final, a->homeworks); a++; } fclose(fd); } // 最多从 filename 文件中读取 nmax 条学生信息,并保存到数组 a。该函数返回实际读取的记录的条数。 int readStudentArray(char filename[], student a[], int nmax) { FILE *fd; // filename 的文件描述符 int i=0; if((fd=fopen(filename,"r"))==NULL){ perror("fopen"); exit(1); } while(fscanf(fd,"%s %d %d %d", a->name, &a->midterm, &a->final, &a->homeworks)!=EOF){ if(++i==nmax) break; // 已经将表格填满 a++; } fclose(fd); return i; } int main(int argc, char *argv[]){ int n; student table[SIZE]; if(argc!=3){ printf("Usage: %s infile outfile\n", argv[0]); exit(0); } n = readStudentArray(argv[1],table,SIZE); writeStudentArray(argv[2],table,n); }该程序构建后,需要通过命令行工具(cmd.exe)运行。
例如,我编译后的程序在 E:\cDemo\Debug\ 文件,需要操作的两个文件位于 D 盘根目录,分别为 input.txt 和 output.txt,output.txt 为空,input.txt 的内容为:
cyuyan 45 20 30
see.xidian.edu.cn/cpp/ 35 90 100
tom 89 99 88
需要在命令行进行如下操作:
打开 output.txt,发现与 input.txt 的内容一样。