int j; FILE *fp; if((fp=fopen("d:\\PEOPLE.txt","r"))==NULL) { printf("Connot open file strike any key exit!\n"); exit(0); } else { for(j=0;fread(&peo[j],sizeof(struct meeting),1,fp)!=0;j++);//从文件中读取数据 len=j; for(i=0;i<len;i++) { strcpy(peo[len].name,peo[j].name); strcpy(peo[len].tele,peo[j].tele); strcpy(peo[len].ID,peo[j].ID); strcpy(peo[len].department,peo[j].department); strcpy(peo[len].room_num,peo[j].room_num); }//把文件中的数据复制到结构体中 } fclose(fp);//关闭文件
时间: 2024-04-04 21:33:19 浏览: 111
这段代码的作用是读取一个名为 "d:\\PEOPLE.txt" 的文件,将文件中的数据读入到一个结构体数组 peo 中,并将文件中的数据复制到结构体中。其中,结构体的定义没有给出。在代码中使用了 fread 函数来从文件中读取数据,文件中的数据是以结构体的形式存储的,每次读取一个结构体的数据,同时 j 会自增,表示已经读取了多少个结构体。最后,将文件指针关闭。如果无法打开文件,则输出错误信息并退出程序。
相关问题
输出改为输出到文件printf("*********************************************************\n"); printf("|姓名\t|学号\t|数学\t|英语\t|计算机\t|平均分\t|总分\t|\n"); while(Stu){ people++; printf("*********************************************************\n"); printf("|%s\t|%03d\t|%d\t|%d\t|%d\t|%d\t|%d\t|\n",Stu->name,Stu->number,Stu->math,Stu->english, Stu->computer,Stu->average,Stu->total); Stu=Stu->next; }
下面是将该代码改为输出到文件的代码:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
// 打开文件
FILE *fp = fopen("output.txt", "w");
if (fp == NULL) {
printf("无法打开文件!\n");
exit(1);
}
// 输出表头
fprintf(fp, "*********************************************************\n");
fprintf(fp, "|姓名\t|学号\t|数学\t|英语\t|计算机\t|平均分\t|总分\t|\n");
// 输出表格数据
while (Stu) {
people++;
fprintf(fp, "*********************************************************\n");
fprintf(fp, "|%s\t|%03d\t|%d\t|%d\t|%d\t|%d\t|%d\t|\n", Stu->name, Stu->number, Stu->math, Stu->english, Stu->computer, Stu->average, Stu->total);
Stu = Stu->next;
}
// 关闭文件
fclose(fp);
return 0;
}
```
在这个代码中,我们使用了 `fopen()` 函数打开文件,将输出结果写入到文件中,最后使用 `fclose()` 函数关闭文件。我们使用 `fprintf()` 函数代替了 `printf()` 函数,将输出内容写入到文件中。需要注意的是,使用 `fprintf()` 函数时,第一个参数是文件指针,表示将内容输出到哪个文件中。
模拟一个公民身份证信息管理系统。通过读入文件数据,可以查询每个公民的身份证信息等。同时可以进行身份证校验,并将正确的信息保存至指定文件中。程序开始时,自动从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中。 屏幕显示如图1所示界面,允许用户输入选择,得到相应结果。 每次结果输出后,仍应继续显示该界面,允许用户后继操作,直至其输入0,退出程序。 用户选择1时,显示校验位正确的公民信息;用户选择2时,显示校验位错误的公民信息,并统计人数。用户选择3时,将正确公民信息按出生日期排序并输出。用户选择4时,在正确公民信息中查找和指定姓名同名的人数。若用户选择0,会退出程序,但在此之前,会自动将身份证号码正确的数据写入文件person_checked.txt中。
以下是一个可能的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_NAME_LEN 20
#define MAX_ID_NUM_LEN 18
#define MAX_RECORDS 100
typedef struct {
char name[MAX_NAME_LEN];
char id_number[MAX_ID_NUM_LEN + 1];
int year;
int month;
int day;
bool valid;
} Citizen;
Citizen citizens[MAX_RECORDS];
int num_citizens = 0;
// 从文件中读入数据
void read_data() {
FILE *fp = fopen("person.txt", "r");
char line[100];
while (fgets(line, sizeof(line), fp)) {
char *name = strtok(line, ",");
char *id_number = strtok(NULL, ",");
int year = atoi(strtok(NULL, "-"));
int month = atoi(strtok(NULL, "-"));
int day = atoi(strtok(NULL, ",\n"));
strcpy(citizens[num_citizens].name, name);
strcpy(citizens[num_citizens].id_number, id_number);
citizens[num_citizens].year = year;
citizens[num_citizens].month = month;
citizens[num_citizens].day = day;
// 校验身份证号码,并将结果保存到结构体中
int factors[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char check_codes[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
int sum = 0;
for (int i = 0; i < MAX_ID_NUM_LEN; i++) {
if (id_number[i] < '0' || id_number[i] > '9') {
citizens[num_citizens].valid = false;
break;
}
sum += (id_number[i] - '0') * factors[i];
}
if (citizens[num_citizens].valid && check_codes[sum % 11] == id_number[17]) {
citizens[num_citizens].valid = true;
} else {
citizens[num_citizens].valid = false;
}
num_citizens++;
}
fclose(fp);
}
// 按出生日期排序
void sort_by_birthdate() {
for (int i = 0; i < num_citizens; i++) {
for (int j = i + 1; j < num_citizens; j++) {
if (citizens[i].year > citizens[j].year ||
(citizens[i].year == citizens[j].year && citizens[i].month > citizens[j].month) ||
(citizens[i].year == citizens[j].year && citizens[i].month == citizens[j].month && citizens[i].day > citizens[j].day)) {
Citizen temp = citizens[i];
citizens[i] = citizens[j];
citizens[j] = temp;
}
}
}
}
// 统计同名人数
int count_same_name(char *name) {
int count = 0;
for (int i = 0; i < num_citizens; i++) {
if (strcmp(citizens[i].name, name) == 0) {
count++;
}
}
return count;
}
// 输出正确的身份证信息
void print_valid_citizens() {
printf("Valid citizens:\n");
for (int i = 0; i < num_citizens; i++) {
if (citizens[i].valid) {
printf("%s %s %04d-%02d-%02d\n", citizens[i].id_number, citizens[i].name, citizens[i].year, citizens[i].month, citizens[i].day);
}
}
}
// 输出错误的身份证信息并统计人数
void print_invalid_citizens() {
int count = 0;
printf("Invalid citizens:\n");
for (int i = 0; i < num_citizens; i++) {
if (!citizens[i].valid) {
printf("%s %s %04d-%02d-%02d\n", citizens[i].id_number, citizens[i].name, citizens[i].year, citizens[i].month, citizens[i].day);
count++;
}
}
printf("Total: %d invalid citizens\n", count);
}
// 查找同名人数
void find_same_name() {
char name[MAX_NAME_LEN];
printf("Please enter a name: ");
scanf("%s", name);
int count = count_same_name(name);
printf("There are %d people with the same name.\n", count);
}
// 将校验正确的身份证信息写入文件
void write_valid_citizens() {
FILE *fp = fopen("person_checked.txt", "w");
for (int i = 0; i < num_citizens; i++) {
if (citizens[i].valid) {
fprintf(fp, "%s,%s,%04d-%02d-%02d\n", citizens[i].name, citizens[i].id_number, citizens[i].year, citizens[i].month, citizens[i].day);
}
}
fclose(fp);
}
int main() {
read_data();
while (true) {
printf("Please select an option:\n");
printf("1. Show valid citizens\n");
printf("2. Show invalid citizens\n");
printf("3. Sort by birthdate and show\n");
printf("4. Count people with the same name\n");
printf("0. Exit and save\n");
int option;
scanf("%d", &option);
if (option == 1) {
print_valid_citizens();
} else if (option == 2) {
print_invalid_citizens();
} else if (option == 3) {
sort_by_birthdate();
printf("Citizens sorted by birthdate:\n");
for (int i = 0; i < num_citizens; i++) {
if (citizens[i].valid) {
printf("%s %s %04d-%02d-%02d\n", citizens[i].id_number, citizens[i].name, citizens[i].year, citizens[i].month, citizens[i].day);
}
}
} else if (option == 4) {
find_same_name();
} else if (option == 0) {
write_valid_citizens();
printf("Data saved to file person_checked.txt. Exiting...\n");
break;
} else {
printf("Invalid option. Please try again.\n");
}
}
return 0;
}
```
在这个程序中,我们首先定义了一个 Citizen 结构体类型来储存每个公民的信息。在 `read_data()` 函数中,我们从文件中读入每个公民的信息,并将其保存到一个 Citizen 类型的数组中。同时,我们校验了每个公民的身份证号码,并将校验结果保存到结构体中。
在主函数中,我们使用一个循环来接收用户的输入,并根据用户的选择进行相应的操作。如果用户选择 1,我们将输出所有校验正确的公民信息。如果用户选择 2,我们将输出所有校验错误的公民信息,并统计错误人数。如果用户选择 3,我们将按照出生日期排序,并输出所有校验正确的公民信息。如果用户选择 4,我们将要求用户输入一个姓名,然后输出所有与该姓名相同的校验正确的公民信息。如果用户选择 0,我们将保存校验正确的公民信息并退出程序。
在程序中,我们还定义了一些辅助函数来进行具体的操作,例如按出生日期排序、统计同名人数等。最后,我们将校验正确的公民信息写入文件 `person_checked.txt` 中。
注意,这个程序并没有进行输入错误的处理,例如用户输入了一个无效的选项或者姓名等。在实际应用中,需要对这些错误进行处理。
阅读全文