按行依次处理数据的文件操作(C语言版)
这段代码的目的是处理多个文件,为每个文件创建一个新文件,将以 ‘r’ 开头的行添加 “./” 前缀,并将修改后的内容写入新文件。在main函数中,通过调用process函数,逐个处理了一系列文件。在处理文件时,程序创建一个新的文件名,然后逐行读取原文件内容,对以 ‘r’ 开头的行进行修改,并将修改后的内容写入新文件。整个程序的目标是在每一行开头加上 “./”。具体的细节可以参看代码的注释。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// 定义一个函数,该函数用于处理文件
void process(char *name) {
// 打开文件,以读写方式打开
FILE *fp = fopen(name, "r+");
if (fp == NULL) {
printf("%s 无法打开!\n", name);
exit(EXIT_FAILURE); // 如果打开失败,退出程序
}
// 计算文件名的长度
int i, len = strlen(name);
// 创建一个新的文件名,将原文件名加下划线和字符 'p'
char tname[len + 2];
for (i = 0; i < len; i++) {
tname[i] = name[i];
}
tname[i++] = '_';
tname[i] = 'p';
tname[i + 1] = '\0'; // 字符串以 null 结尾
// 以写入方式打开新文件
FILE *tfp = fopen(tname, "w");
if (tfp == NULL) {
fclose(fp);
printf("%s 无法打开!\n", tname);
exit(EXIT_FAILURE); // 如果打开失败,退出程序
}
// 缓冲区,用于存储每一行的内容
char buffer[200];
// 逐行读取原文件内容,并将修改后的内容写入新文件
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
if (buffer[0] != 'r') {
continue; // 如果不是以 'r' 开头的行,则跳过
}
fprintf(tfp, "./%s", buffer); // 在新文件中写入修改后的内容
}
// 关闭原文件和新文件
fclose(fp);
fclose(tfp);
}
int main() {
// 要处理的文件列表
const char *files[] = {
"runAll_CVRP_Augerat_A", "runAll_CVRP_Augerat_B", "runAll_CVRP_Augerat_P",
// 添加其他文件...
};
// 依次处理每个文件
for (int i = 0; i < sizeof(files) / sizeof(files[0]); i++) {
process(files[i]);
}
return 0;
}