当前位置:   article > 正文

【PTA主观题】8-1 文件操作

【PTA主观题】8-1 文件操作

题目要求

  1. 编写函数int input(FILE * fp),录入学生的信息,自定义录入结束方式,但至少包括学号、姓名、班级、分数和登录密码,并按照学号排序后以二进制方式存入stus.dat,函数返回学生数量;
  2. 定义函数void encrypt(char * file_plain, char * file_cipher),用于加密stus.dat的密码字段,其中file_cipher为密文文件标识,file_plain为明文文件标识,加密算法采用与密码进行异或的方式;
  3. 定义函数void decrypt(char * file_cipher, char * file_plain)解密文件;
  4. 定义函数 void show(char * file) 输出文件内容。

将以上几步代码粘贴到报告,并附上运行成功的截图。
注意代码风格和添加充足注释。

代码呈现
 

  1. //C语言
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define SIZE 100
  6. //定义一个名为Student的结构体,用于存储学生信息。
  7. typedef struct student
  8. {
  9. char id[SIZE];
  10. char name[SIZE];
  11. char class[SIZE];
  12. int score;
  13. char password[SIZE];
  14. } Student;
  15. //排序函数
  16. void bubbleSort(Student* stu_list, int num)
  17. {
  18. int i, j;
  19. Student temp;
  20. for (i = 0; i < num - 1; i++)
  21. {
  22. for (j = 0; j < num - i - 1; j++)
  23. {
  24. if (strcmp(stu_list[j].id, stu_list[j + 1].id) > 0)
  25. {
  26. // 交换两个学生信息
  27. temp = stu_list[j];
  28. stu_list[j] = stu_list[j + 1];
  29. stu_list[j + 1] = temp;
  30. }
  31. }
  32. }
  33. }
  34. //输入
  35. int input(FILE* fp)
  36. {
  37. Student stu_list[SIZE];//结构体数据 便于排序
  38. Student stu;
  39. int num = 0;
  40. char end[4] = "end";//输入结束标志
  41. char buffer[SIZE];
  42. while (1)
  43. {
  44. printf("Enter student information (id, name, class, score, password):\n");
  45. fgets(buffer, SIZE, stdin);
  46. //从标准输入(stdin)中读取一行字符串并存储到指定的字符数组(buffer)中
  47. //fgets:从标准输入中逐行读取字符,直到遇到换行符(包括换行符在内)。
  48. //它会将读取的字符存储到指定的字符数组中,并自动在字符串末尾添加一个空字符('\0')表示字符串的结束。
  49. if (strncmp(buffer, end, 3) == 0)
  50. //检查是否输入了结束标志,如果 buffer 的前3个字符与 end 的前3个字符完全相等,break
  51. break;
  52. sscanf(buffer, "%s %s %s %d %s", stu_list[num].id, stu_list[num].name, stu_list[num].class, &stu_list[num].score, stu_list[num].password);
  53. //sscanf:从指定的字符串中读取数据并按照指定的格式进行解析
  54. //从buffer中按照格式化字符串解析出一个字符串,存储到stu.id中
  55. //忽略一个或多个空格字符(以此类推)
  56. num++;
  57. }
  58. // 按学号排序
  59. bubbleSort(stu_list, num);
  60. // 写入二进制文件
  61. fwrite(stu_list, sizeof(Student), num, fp);
  62. //fwrite:将结构体对象stu写入文件中。
  63. //size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
  64. //ptr:要写入数据的内存地址。buffer(数组名相当于地址)
  65. //size:每个元素的大小(以字节为单位)。sizeof(Student)
  66. //count:要写入的元素数量。1
  67. //stream:指向要写入数据的文件流。,fp
  68. return num;
  69. }
  70. void encrypt(char* file_plain, char* file_cipher)
  71. {
  72. FILE* fp1, * fp2;
  73. Student stu;
  74. int i;
  75. fp1 = fopen(file_plain, "rb");
  76. fp2 = fopen(file_cipher, "wb");
  77. //FILE *fopen(const char *filename, const char *mode);返回值:
  78. //如果文件成功打开,则返回一个指向 FILE 类型结构的指针,该指针用于后续对文件进行读写操作。
  79. //如果文件打开失败,则返回 NULL。
  80. //filename:表示要打开的文件名或文件路径的字符串。
  81. //mode:表示打开文件的模式的字符串。模式字符串可以是以下值之一(常见的模式):
  82. // "r" 只读模式(文件必须存在)
  83. //"w" 写入模式(如果文件存在则截断,不存在则创建)
  84. //"a" 追加模式(如果文件存在则在末尾追加,不存在则创建)
  85. //"rb" 二进制只读模式
  86. //"wb" 二进制写入模式
  87. //"ab" 二进制追加模式
  88. while (fread(&stu, sizeof(Student), 1, fp1))
  89. {//对于每个读取到的结构体,循环遍历其password成员中的每个字符,并对其进行异或加密操作
  90. for (i = 0; i < strlen(stu.password); i++)
  91. {
  92. stu.password[i] ^= 7;
  93. //(使用异或运算符^和常数7)然后将加密后的结构体写入fp2指向的文件中。
  94. }
  95. fwrite(&stu, sizeof(Student), 1, fp2);
  96. }
  97. //关闭文件指针fp1和fp2
  98. fclose(fp1);
  99. fclose(fp2);
  100. }
  101. void decrypt(char* file_cipher, char* file_plain)
  102. {
  103. FILE* fp1, * fp2;
  104. Student stu;
  105. int i;
  106. fp1 = fopen(file_cipher, "rb");
  107. fp2 = fopen(file_plain, "wb");
  108. while (fread(&stu, sizeof(Student), 1, fp1))
  109. {
  110. for (i = 0; i < strlen(stu.password); i++)
  111. {
  112. stu.password[i] ^= 7; // 与密码进行异或解密
  113. }
  114. fwrite(&stu, sizeof(Student), 1, fp2);
  115. }
  116. fclose(fp1);
  117. fclose(fp2);
  118. //int fclose(FILE *stream);
  119. // stream 是一个指向 FILE 类型结构的指针,该指针是由 fopen 函数返回的。
  120. //如果关闭成功,则返回 0;否则,返回一个非零值。
  121. }
  122. void show(char* file) {
  123. FILE* fp;
  124. Student stu;
  125. fp = fopen(file, "rb");
  126. while (fread(&stu, sizeof(Student), 1, fp) == 1) {
  127. printf("ID: %s\n", stu.id);
  128. printf("Name: %s\n", stu.name);
  129. printf("Class: %s\n", stu.class);
  130. printf("Score: %d\n", stu.score);
  131. printf("Password: %s\n", stu.password);
  132. printf("--------------------\n");
  133. }
  134. fclose(fp);
  135. }
  136. int main()
  137. {
  138. FILE* fp;
  139. int num;
  140. char file_plain[] = "stus.dat";
  141. char file_cipher[] = "stus_cipher.dat";
  142. // 输入学生信息并存储到二进制文件中
  143. fp = fopen(file_plain, "wb");
  144. num = input(fp);
  145. fclose(fp);
  146. // 对密码字段进行加密
  147. encrypt(file_plain, file_cipher);
  148. // 输出加密后的文件内容
  149. printf("Encrypted file content:\n");
  150. show(file_cipher);
  151. // 对加密后的文件进行解密
  152. decrypt(file_cipher, file_plain);
  153. // 输出解密后的文件内容
  154. printf("\nDecrypted file content:\n");
  155. show(file_plain);
  156. return 0;
  157. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/67958?site
推荐阅读
相关标签
  

闽ICP备14008679号