解释void savingRecord() { int i; FILE *fp=fopen("data.txt","w"); if(fp==NULL) { printf("文件无法打开"); } for(i=0;i<count;i++) { fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",a[i].class,a[i].name,a[i].num,a[i].phone1,a[i].phone2,a[i].addr,a[i].code); } printf("班级 姓名 学号 手机号 手机号-短号 家庭住址 邮编\n"); for(i=0;i<count;i++) { printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n",a[i].class,a[i].name ,a[i].num ,a[i].phone1 ,a[i].phone2,a[i].addr,a[i].code); } fclose(fp); system("pause"); }
时间: 2024-04-29 11:20:04 浏览: 44
这是一个C语言的函数,名为savingRecord(),它没有返回值(void)。该函数的目的是将一些数据以特定的格式写入一个名为"data.txt"的文本文件中,同时将这些数据打印到控制台。具体来说,该函数使用fopen()函数打开一个文本文件,并将文件指针保存在指针变量fp中。如果文件打开失败,则会输出一条错误信息。接下来,该函数使用for循环遍历一个数组a,该数组中存储了一些学生的信息,例如班级、姓名、学号、电话号码等等。在for循环中,使用fprintf()函数将每个学生的信息按照指定的格式写入到文件中。其中,"\t"表示制表符,用于在输出时对齐。紧接着,该函数使用printf()函数将相同的数据输出到控制台,以便于用户查看。最后,该函数使用fclose()函数关闭文件,并使用system()函数暂停程序的执行,以便用户查看输出结果。
相关问题
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_LINE_LEN 1024 #define MAX_DATA_POINTS 1024 enum { SENSOR_TYPE_YULV = 0, SENSOR_TYPE_DIANDAO, SENSOR_TYPE_PH, SENSOR_TYPE_ORP, SENSOR_TYPE_ZHOUDU, NUM_SENSOR_TYPES }; typedef struct { int point_id; int sensor_type; float value; } data_point_t; data_point_t data_points[MAX_DATA_POINTS]; int num_data_points = 0; char *sensor_type_names[NUM_SENSOR_TYPES] = { "余氯", "电导率", "PH", "ORP", "浊度" }; void save_data_points() { FILE *fp = fopen("C:\\Users\\pc\\Desktop\\test.txt", "w"); if (fp == NULL) { printf("保存数据失败\n"); return; } fprintf(fp, "检测点 传感器 数值\n"); for (int i = 0; i < num_data_points; i++) { data_point_t *p = &data_points[i]; fprintf(fp, "%d (%d) %.2f\n", p->point_id, p->sensor_type, p->value); } fclose(fp); printf("数据已保存\n"); } void load_data_points() { FILE *fp = fopen("C:\\Users\\pc\\Desktop\\test.txt", "r"); if (fp == NULL) { printf("没有找到数据文件\n"); return; } char line[MAX_LINE_LEN]; while (fgets(line, MAX_LINE_LEN, fp) != NULL) { char *fields[3]; int num_fields = 0; char *tok = strtok(line, ","); while (tok != NULL) { fields[num_fields++] = tok; tok = strtok(NULL, ","); } if (num_fields != 3) { printf("数据文件格式错误\n"); fclose(fp); return; } int point_id = atoi(fields[0]); int sensor_type = atoi(fields[1]); float value = atof(fields[2]); data_point_t *p = &data_points[num_data_points++]; p->point_id = point_id; p->sensor_type = sensor_type; p->value = value; } fclose(fp); printf("数据已加载,共%d条\n", num_data_points); }
这段代码是一个简单的数据点存储和读取程序。它定义了一个结构体`data_point_t`来存储每个数据点的点ID、传感器类型和数值,并定义了一个全局数组`data_points`来存储所有数据点。此外,还定义了一个字符串数组`sensor_type_names`来存储传感器类型的名称。
`save_data_points`函数将所有数据点写入文本文件,以便以后读取。`load_data_points`函数读取文本文件中的所有数据点,并将它们存储在全局数组`data_points`中。
这个程序使用了标准C库函数`fopen`,`fclose`,`fgets`和`fprintf`来打开、关闭、读取和写入文件。它也使用了字符串处理函数`strtok`,`atoi`和`atof`来解析文件中的行和字段。
(p != NULL) { free(pre); pre = p; p = p->next; } free(pre); } static void delete_all( WorkerList *&L) { FILE *fp = NULL; fp = fopen("emp.dat", "wb"); if(fp == NULL) { cout<<"不能打开职工文件\n\n\n"; return; } fclose(fp); destroy_employee(L); L = ( WorkerList *)malloc(sizeof( WorkerList)); L->next = NULL; cout<<"职工数据清除完毕\n\n\n"; } static void read_file( WorkerList *&L) { FILE *fp; Worker emp; WorkerList *p; WorkerList *r; int n = 0; L = ( WorkerList *)malloc(sizeof( WorkerList)); r = L; if((fp = fopen("emp.dat", "rb")) == NULL) { if((fp = fopen("emp.dat", "wb")) == NULL) { cout<<"不能创建emp.dat文件\n\n\n"; } } else { while(fread(&emp, sizeof( Worker), 1, fp) == 1) { p = ( WorkerList *)malloc(sizeof( WorkerList)); p->data = emp; r->next = p; r = p; n++; } } r->next = NULL; cout<<"职工单链表L建立完毕,有"<<n<<"个记录\n"; fclose(fp); } static void display_employee( WorkerList *L) { WorkerList *p = L->next; if(p == NULL) { cout<<"没有任何职工记录\n"; } else { cout<<" 职工号 姓名 部门号 薪水\n"; printf(" ----------------------------------------------\n"); while(p != NULL) { printf(" %3d %10s %-8d %7.2f\n", p->data.no, p->data.name, p->data.depno, p->data.salary); p = p->next; } cout<<" --用自然语言写出算法步骤
算法步骤如下:
1. 定义函数 `destroy_employee`,传入参数为指向链表头节点的指针 `L`。
2. 在函数中,定义两个指针 `pre` 和 `p`,分别指向链表头节点和链表第一个数据节点。
3. 使用循环遍历链表,当指针 `p` 不为 NULL 时,执行以下操作:
a. 释放指针 `pre` 指向的节点的内存空间;
b. 将指针 `pre` 指向指针 `p` 所指向的节点;
c. 将指针 `p` 指向下一个数据节点。
4. 在循环结束后,释放指针 `pre` 指向的节点的内存空间。
5. 定义函数 `delete_all`,传入参数为指向链表头节点的指针 `L`。
6. 在函数中,尝试打开职工信息文件 "emp.dat",并以写入二进制数据的方式打开文件,如果打开失败则输出错误信息并返回。
7. 关闭打开的文件。
8. 调用函数 `destroy_employee`,释放链表中的所有节点的内存空间。
9. 重新分配内存空间,将指针 `L` 指向一个新的链表头节点,链表为空。
10. 输出提示信息,表示职工数据已经被清除。
11. 定义函数 `read_file`,传入参数为指向链表头节点的指针 `L`。
12. 在函数中,定义变量 `fp`,表示文件指针,用于打开职工信息文件。
13. 定义变量 `emp`,表示职工结构体,用于存储从文件中读取的职工信息。
14. 定义指针变量 `p` 和 `r`,分别指向链表头节点和链表最后一个数据节点。
15. 定义变量 `n`,表示链表中职工信息的数量,初始化为 0。
16. 分配内存空间,将指针 `L` 指向一个新的链表头节点。
17. 如果无法打开职工信息文件,则尝试创建文件。
18. 如果打开或创建文件失败,则输出错误信息并返回。
19. 否则,使用循环遍历文件中的每一个职工信息,将其存储在链表中,并计算出链表中职工信息的数量。
20. 在循环结束后,将指针 `r` 所指向的节点的指针域设置为 NULL,表示链表的最后一个节点。
21. 输出提示信息,表示职工单链表已经建立完毕,并显示链表中职工信息的数量。
22. 关闭打开的文件。
23. 定义函数 `display_employee`,传入参数为指向链表头节点的指针 `L`。
24. 在函数中,定义指针变量 `p`,指向链表的第一个数据节点。
25. 如果链表为空,则输出提示信息,表示没有任何职工记录。
26. 否则,按照一定格式输出链表中的职工信息。
27. 输出分隔线,作为表格的底部。
28. 使用循环遍历链表,将链表中的职工信息逐一输出。
29. 输出分隔线,作为表格的底部。
阅读全文