FILE* fr = fopen("C:\\Users\\86180\\Desktop\\C&C++\\KMP算法\\目标字符串.txt", "r");为什么这段代码返回值fr为空
时间: 2023-11-20 19:05:20 浏览: 64
这段代码返回值fr为空可能有以下几个原因:
1. 目标文件不存在或路径不正确,导致文件打开失败,此时fr为NULL。
2. 目标文件没有读取权限,导致文件打开失败,此时fr为NULL。
3. 程序没有关闭目标文件,导致文件被占用,此时再次打开文件会失败,此时fr为NULL。
你可以检查一下以上几个原因,看看是否能够解决问题。
相关问题
void cancle_password_teacher() { char filename[] = "C:\\Users\\32172\\Desktop\\学生管理系统\\教师账号密码.txt"; char tempname[] = "C:\\Users\\32172\\Desktop\\学生管理系统\\temp.txt"; FILE *fp, *temp; char line[100]; fp = fopen(filename, "r"); temp = fopen(tempname, "w"); char id[6]; printf("请输入删除教师工号:"); scanf("%s",&id); while (fgets(line, sizeof(line), fp)) { // 如果不包含匹配字符串,则写入临时文件 if (!strstr(line, id)) { fputs(line, temp); } } fclose(fp); fclose(temp); remove(filename); // 将临时文件重命名为原文件名 rename(tempname, filename); printf("工号为%s的教师信息删除成功,请按任意键返回\n",id); }运行后文件名为temp,并没有改名并且程序有bug
根据你提供的代码,我发现在使用 `fgets` 读取文件中的一行时,可能会读取到换行符。这可能会导致在比较教师工号时出现问题。另外,使用 `scanf` 读取字符串时,不需要使用 `&`,因为字符串本身就是指针。
以下是修复后的代码:
```c
void cancel_password_teacher() {
char filename[] = "C:\\Users\\32172\\Desktop\\学生管理系统\\教师账号密码.txt";
char tempname[] = "C:\\Users\\32172\\Desktop\\学生管理系统\\temp.txt";
FILE *fp, *temp;
char line[100];
fp = fopen(filename, "r");
temp = fopen(tempname, "w");
char id[6];
printf("请输入删除教师工号:");
scanf("%s", id);
while (fgets(line, sizeof(line), fp)) {
// 去掉换行符
line[strcspn(line, "\n")] = '\0';
// 如果不包含匹配字符串,则写入临时文件
if (!strstr(line, id)) {
fputs(line, temp);
fputs("\n", temp);
}
}
fclose(fp);
fclose(temp);
remove(filename);
rename(tempname, filename);
printf("工号为%s的教师信息删除成功,请按任意键返回\n", id);
}
```
这里我们使用了 `strcspn` 函数来找到字符串中的换行符,并将其替换为结束符。另外,在写入临时文件时,需要手动添加换行符,以保证每行之间的正确性。
优化这段代码,并添加中文注释:// 创建文件函数 void create_file(FILE *fp, char *fname) { // 获取用户输入的新文件名 printf("\t请输入新建的文件名:\n\t"); scanf("%s", fname); // 直接读取字符串,不需要再输入回车键 char *pos; // 查找'\n'字符 if ((pos = strchr(fname, '\n')) != NULL) { // 将'\n'替换为'\0' *pos = '\0'; } // 添加文件后缀名 ".txt" strcat(fname, ".txt"); // 定义文件路径 char path[MAX_LEN] = "C:\\Users\\dell\\Desktop\\软件设计-源文件\\A2-1\\work"; strcat(path, fname); // 创建文件并判断是否成功 if ((fp = fopen(fname, "w+")) == NULL) { printf("\t不能打开文件!\n"); exit(0); } printf("\t%s文件已经创建好!\n\n", fname); fclose(fp); }
// 创建文件函数
void create_file(FILE *fp, char *fname) {
// 获取用户输入的新文件名
printf("\t请输入新建的文件名:\n\t");
scanf("%s", fname); // 直接读取字符串,不需要再输入回车键
// 查找'\n'字符
char *pos = strchr(fname, '\n');
if (pos != NULL) {
// 将'\n'替换为'\0'
*pos = '\0';
}
// 添加文件后缀名 ".txt"
strcat(fname, ".txt");
// 定义文件路径
char path[MAX_LEN] = "C:\\Users\\dell\\Desktop\\软件设计-源文件\\A2-1\\work";
strcat(path, fname);
// 创建文件并判断是否成功
if ((fp = fopen(path, "w+")) == NULL) {
printf("\t不能打开文件!\n");
exit(0);
}
printf("\t%s文件已经创建好!\n\n", fname);
fclose(fp);
}
// 优化后的代码:
void create_file(FILE *fp, char *fname) {
// 获取用户输入的新文件名
printf("\t请输入新建的文件名:\n\t");
scanf("%s", fname); // 直接读取字符串,不需要再输入回车键
// 查找并删除字符串末尾的'\n'字符
fname[strcspn(fname, "\n")] = '\0';
// 添加文件后缀名 ".txt" 并定义文件路径
char path[MAX_LEN] = "C:\\Users\\dell\\Desktop\\软件设计-源文件\\A2-1\\work\\";
strcat(path, fname);
strcat(path, ".txt");
// 创建文件并判断是否成功
if ((fp = fopen(path, "w+")) == NULL) {
printf("\t不能打开文件!\n");
exit(0);
}
printf("\t%s 文件已创建成功!\n\n", fname);
fclose(fp);
}
// 优化后的代码说明:
// 1. 使用 strcspn 函数查找并删除字符串末尾的 '\n' 字符。
// 2. 同时添加文件后缀名 ".txt" 与定义文件路径,避免在后面重复拼接。
// 3. 修改了提示信息,使其更符合中文表达习惯。
// 4. 删除了不必要的指针定义和判断。
阅读全文