C++如何从单个TXT文件拆分导出多个指定行数的TXT文件
原有代码只能处理少于10个文件的核心原因很明显:你原来的文件名是固定的字符数组,只修改第一个字符的数值,最多只能生成1到9开头的文件名,序号超过个位数就完全没法用了;另外原有逻辑是硬编码拆成3个文件,和你要拆5000份、每份100行的需求完全不匹配。
修改后的代码如下:
#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; int main() { vector<string> VecData; string data; // 读取源文件所有数据 ifstream in("mytext.txt"); while (in >> data) { VecData.push_back(data); } in.close(); const int LINES_PER_FILE = 100; // 每个输出文件存100行 const int COLS_PER_LINE = 5; // 每行固定5列 const int ELEM_PER_FILE = LINES_PER_FILE * COLS_PER_LINE; // 每个文件对应vector里的元素数量 int total_file_cnt = VecData.size() / ELEM_PER_FILE; ofstream out_file; for (int file_no = 1; file_no <= total_file_cnt; file_no++) { // 动态生成带序号的文件名,支持任意位数序号 string file_name = to_string(file_no) + "_Hello.txt"; out_file.open(file_name); // 写入当前文件对应的100行数据 int start_pos = (file_no - 1) * ELEM_PER_FILE; int end_pos = file_no * ELEM_PER_FILE; for (int i = start_pos; i < end_pos; i += COLS_PER_LINE) { out_file << VecData[i] << "\t" << VecData[i+1] << "\t" << VecData[i+2] << "\t" << VecData[i+3] << "\t" << VecData[i+4] << "\n"; } out_file.close(); } cout << "Done\n"; return 0; }
主要调整点:
- 把原有的硬编码文件名逻辑改成了字符串动态拼接,直接把文件序号转成字符串再拼上固定后缀,不管是两位数还是四位数的序号都能正常生成文件名,完全满足5000个文件的命名需求
- 删掉了原有的固定拆3份的逻辑,按需求定义了参数常量,自动计算每个文件要写的内容范围和总拆分数量
- 遍历逻辑完全按输入的行顺序分配,第1个文件存1-100行,第2个存101-200行,直到最后一个文件存最后100行,和你要求的规则完全一致
- 如果你后续要处理更大的文件不想占太多内存,也可以不用把所有数据存到vector里,读一行写一行计数到100就换文件就行,现在50万行的量级用现有逻辑完全没问题。
内容的提问来源于stack exchange,提问作者kingsley
相关产品推荐
相关产品推荐

