优化此程序:// 插入函数,用于在指定位置插入内容到指定文件 void insert_file(FILE *fp, char *fname) { char ch; long int pos; int len = 0; // 获取用户输入的文件名 printf("\t请输入插入的文件名:\n\t"); // 从标准输入中获取文件名 fgets(fname, MAX_LEN, stdin); // 查找'\n'字符并替换为'\0' char *pos1 = NULL; if ((pos1 = strchr(fname, '\n')) != NULL) *pos1 = '\0'; // 添加后缀名".txt",如果没有输入 if (!strstr(fname, ".txt")) strcat(fname, ".txt"); // 打开文件并判断是否打开成功 if ((fp = fopen(fname, "r+")) == NULL) { // 打开文件方式改为"r+",即可读可写 printf("\t不能打开文件!\n"); exit(0); } // 获取文件长度 fseek(fp, 0, SEEK_END); len = ftell(fp); // 显示文件已有内容 printf("\t文件已有内容:\n"); rewind(fp); while ((ch = fgetc(fp)) != EOF) { putchar(ch); } // 获取用户输入的插入位置 printf("\n\t请输入插入的位置(从0开始):\n\t"); scanf("%ld", &pos); getchar(); // 读取换行符 // 获取用户输入的插入内容并计算长度 printf("\t请输入要插入的内容(以#结束):\n\t"); char input[MAX_LEN]; int input_len = 0; while ((ch = getchar()) != '#') { input[input_len++] = ch; } // 如果输入内容长度超过了文件长度,则提示插入位置错误 if (pos + input_len > len) { printf("\t插入位置错误!\n"); exit(0); } // 依次将后面的字符往后移动input_len个字符 for (int i = len; i >= pos + 1; i--) { fseek(fp, i - 1, SEEK_SET); ch = fgetc(fp); fseek(fp, i + input_len - 1, SEEK_SET); fputc(ch, fp); } // 将输入内容插入到文件中 fseek(fp, pos, SEEK_SET); fputs(input, fp); printf("\t编辑后内容:\n"); rewind(fp); while ((ch = fgetc(fp)) != EOF) { putchar(ch); } // 关闭文件 fclose(fp); printf("\n\t插入成功!\n"); }
时间: 2024-03-26 08:36:36 浏览: 74
Python实现删除文件中含“指定内容”的行示例
5星 · 资源好评率100%
以下是对该程序的优化建议:
1. 将函数参数char *fname改为const char *fname,因为函数内部并没有修改fname指向的字符串,这样可以提高函数的可读性和安全性。
2. 不必在函数内部再次获取文件名,而是将文件名作为参数传递给函数。
3. 将文件打开方式改为"w+",这样可以在文件不存在时创建新文件。
4. 不必先获取文件长度再输出文件内容,可以直接输出文件内容。
5. 可以在读取用户输入的插入内容时,使用fgets()函数代替while循环,这样可以避免读取到#字符后还需要再读取一次换行符。
6. 在插入内容之前,可以先将文件指针移动到插入位置,这样就不必先将后面的字符往后移动。
7. 在插入完成后,可以将文件指针移动到文件末尾,这样可以避免后续操作出现问题。
8. 可以在程序中加入错误处理机制,比如在打开文件失败时输出错误信息并退出程序。
下面是优化后的代码:
void insert_file(const char *fname, int pos, const char *input) {
FILE *fp;
char ch;
int len = 0;
// 打开文件并判断是否打开成功
if ((fp = fopen(fname, "w+")) == NULL) {
printf("\t不能打开文件!\n");
exit(0);
}
// 显示文件已有内容
printf("\t文件已有内容:\n");
rewind(fp);
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
// 如果输入内容长度超过了文件长度,则提示插入位置错误
fseek(fp, 0, SEEK_END);
len = ftell(fp);
if (pos > len) {
printf("\t插入位置错误!\n");
fclose(fp);
exit(0);
}
// 将文件指针移动到插入位置
fseek(fp, pos, SEEK_SET);
// 将输入内容插入到文件中
fputs(input, fp);
printf("\t编辑后内容:\n");
rewind(fp);
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
// 将文件指针移动到文件末尾
fseek(fp, 0, SEEK_END);
// 关闭文件
fclose(fp);
printf("\n\t插入成功!\n");
}
阅读全文