#include<stdio.h> #include<stdlib.h> int main() { FILE*fp; char ch[1001],str[100],*p=ch; char c; int a; if((fp=fopen("d:\\fqh.txt","r"))==NULL) { printf("文件打开失败!\n"); exit(0); } while(!feof(fp)) { c=fgetc(fp); fputc(c,fp); } printf("输入关键字:\n"); getchar(); gets(str); fputs(str,fp); fseek(fp,10L,0); fgets(str,5,fp); puts(str); fclose(fp); return 0; }就算找到了文件“fqh”,输入关键字也不能得到预期内容,请找出错误,并给予修正
时间: 2024-01-13 19:02:32 浏览: 69
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
这段代码存在几个问题:
1. 在 while 循环中,读取文件后直接写回到文件中,导致文件内容被覆盖,最终文件内容为空。
2. 使用 gets 函数获取用户输入,存在缓冲区溢出的风险。
3. 在使用 fgets 函数读取文件内容时,读取的长度为 5,但是实际上文件中可能不足 5 个字符,这样会导致读取到文件末尾的字符,并且不会自动添加字符串结束符 '\0'。
下面是修改后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *fp;
char ch[1001], str[100];
char *p = ch;
int a;
if ((fp = fopen("d:\\fqh.txt", "r+")) == NULL) {
printf("文件打开失败!\n");
exit(0);
}
// 读取文件内容
while (fgets(ch, 1001, fp) != NULL) {
printf("%s", ch);
}
// 获取用户输入,并写入文件
printf("输入关键字:\n");
fgets(str, 100, stdin);
fputs(str, fp);
// 重新读取文件内容,定位到指定位置,并读取指定长度的内容
fseek(fp, 10L, SEEK_SET);
fgets(str, 6, fp);
printf("%s", str);
fclose(fp);
return 0;
}
```
修改后的代码中:
1. 使用 fgets 函数读取文件内容,并在控制台输出。
2. 使用 fgets 函数获取用户输入,并写入文件。
3. 在使用 fgets 函数读取文件内容时,读取长度为 6,因为要读取 5 个字符和一个字符串结束符 '\0'。
4. 使用 SEEK_SET 参数替换 0 参数,使得 fseek 函数更加清晰易懂。
阅读全文