#define N 10 #include <stdio. h> int main() { char no[N] [8], att[10]; int i,n, count[N]; FILE *fp; fp=fopen("C:\\Users\\libinling\\Desktop\\student.txt","r"); if( fp==NULL) { puts("can't open money.txt"); exit(0); } i=0; while(!feof(fp)) { fscanf(fp,"%s %d\n", no[i],&count[i]); printf( "%s %d\n", no[i], count[i]); i++ ; } n= i ; fclose(fp); for ( i=0;i<n;i++) { puts(no[i]); puts("present or absent"); gets(att); if (strcmp(att,"present")==0) count[i]++; } fp=fopen("C:\\Users\\libinling\\Desktop\\student.txt","w"); if ( fp==NULL) { puts("can't open money. txt"); exit ( 0); } for ( i=0;i <n;i++) fprintf(fp,"%s %d\n", no[i], count[i]); fclose(fp); return 0; }这个代码能解决上面的问题吗
时间: 2024-03-18 07:46:00 浏览: 23
这个代码看起来与上面的问题是类似的,也是从文件中读取学生信息,然后进行点名并更新出勤次数,最后将结果写回文件。但是这个代码存在一些问题:
1. 定义了一个宏 `N`,用来表示学生数量,但是这个宏并没有被使用,而是在代码中直接使用了数字10。这样会导致代码可读性较差,也不便于修改。
2. 在读取文件时,使用了 `while(!feof(fp))` 的方式进行循环,这种方式是不可靠的,容易导致死循环或者重复读取最后一行的情况。正确的方式应该是使用 `while(fscanf(fp,"%s %d\n", no[i],&count[i])==2)`,即在读取文件时判断是否成功读取到2个值(即学号和出勤次数),如果读取成功则继续循环,否则跳出循环。
3. 在输入学生出勤情况时,使用了 `gets` 函数,这个函数是不安全的,容易导致缓冲区溢出。正确的方式应该是使用 `fgets` 函数,并手动去掉输入字符串的末尾换行符。
4. 在写入文件时,使用了 `fprintf(fp,"%s %d\n", no[i], count[i])` 的方式,这种方式会在每个学生信息的末尾写入一个换行符,导致文件格式不规范。正确的方式应该是在最后一个学生信息后不写入换行符。
综上所述,这个代码存在一些问题,需要进行改进才能正确地解决上面的问题。
相关问题
#include <iostream> #include <stdio.h> #include <math.h> #define N 5
这段代码是C++中的预处理指令,用于引入头文件和定义宏。具体解释如下:
1. `#include <iostream>`:引入iostream头文件,该头文件包含了C++中输入输出流的相关函数和对象,例如cout和cin。
2. `#include <stdio.h>`:引入stdio.h头文件,该头文件包含了C语言中的输入输出函数,例如printf和scanf。
3. `#include <math.h>`:引入math.h头文件,该头文件包含了数学函数的声明和定义,例如sqrt和pow。
4. `#define N 5`:定义一个宏常量N,并将其值设置为5。宏定义是一种在编译前进行文本替换的机制,这里将所有出现N的地方都替换为5。
这段代码的作用是引入所需的头文件和定义一个宏常量N,并没有实际的功能代码。
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int ElemType; typedef struct
这段代码是C语言中的头文件引用和一些定义的示例。其中,`#include <stdio.h>`和`#include <stdlib.h>`是用来引入标准库函数的头文件。`stdio.h`包含了输入输出相关的函数,如`printf`和`scanf`;`stdlib.h`包含了一些常用的函数,如内存分配函数`malloc`和随机数生成函数`rand`。
`#define MAXSIZE 100`是一个宏定义,用来定义一个常量`MAXSIZE`,它的值为100。
`typedef int ElemType;`是用来给`int`类型起一个别名`ElemType`,方便在代码中使用。
至于代码中的结构体部分,由于你没有提供完整的代码,所以无法给出具体的解释。但一般来说,结构体用于定义一种自定义的数据类型,可以包含多个不同类型的成员变量。
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![application/x-gzip](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)