【C/C++】等分或指定行数把txt文档拆分成多份
生活随笔
收集整理的這篇文章主要介紹了
【C/C++】等分或指定行数把txt文档拆分成多份
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?1、輸入如下:
2、執行代碼:
3、輸出如下:
4、代碼如下:
4.1、平均拆分代碼
#include <iostream> #include <string> #include <fstream>using namespace std;//待處理樣本的路徑 #define TXT_PATH_NAME "..\\Inputs\\List.txt"void getTxtPartName (char *partName, string txtPathName) ;int main() {//統計txt中的總行數ifstream countSamplesNum(TXT_PATH_NAME);string samplesPathName;int samplesNum = 0; //txt中的總行數int splitNum = 0; //計劃拆分的份數int averageSamplesNum = 0; //平均每份的行數int remainder = 0; //余數//循環讀取txt的各行while (1) {if (!getline(countSamplesNum,samplesPathName)) {break;}if (samplesPathName.empty()) {continue; }samplesNum++;}cout<<"輸入txt的總行數:"<<samplesNum<<endl;cout<<"請輸入拆分數量:";cin>>splitNum;averageSamplesNum = samplesNum/splitNum;remainder = samplesNum%splitNum;char dispParams[1024]; //讀入原文件的名字char saveNameExt[1024]; //保存新文件的名字,源文件加數字getTxtPartName(dispParams, TXT_PATH_NAME); //從輸入txt的路徑獲取txt文件名if (remainder) //不能整除{cout<<endl<<endl<<"拆分結果如下:"<<endl<<"前"<<(splitNum-1)<<"份的行數為:"<<averageSamplesNum<<", 最后1份的行數為:"<<(samplesNum - averageSamplesNum*(splitNum-1))<<endl<<endl;}else //可以整除{cout<<endl<<endl<<"拆分結果如下:"<<endl<<splitNum<<"份的行數均為:"<<averageSamplesNum<<endl<<endl;}//實現拆分,文件保存ifstream totalSamplesPath(TXT_PATH_NAME);string singleSamplesPath;for (int i=0; i<splitNum-1; i++){sprintf(saveNameExt, "%s_%d.txt", dispParams, i);FILE *labelfilename = fopen(saveNameExt, "w+t");for (int j=0; j<averageSamplesNum; j++){getline(totalSamplesPath, singleSamplesPath);const char* ch=singleSamplesPath.c_str();if (j==0){fprintf(labelfilename, "%s", ch);} else {fprintf(labelfilename, "\n%s", ch);}}fclose(labelfilename);}//保存最后1份sprintf(saveNameExt, "%s_%d.txt", dispParams, (splitNum-1));FILE *labelfilename = fopen(saveNameExt, "w+t");int flg = 0;while (getline(totalSamplesPath, singleSamplesPath)){const char* ch=singleSamplesPath.c_str();if (0 == flg){fprintf(labelfilename, "%s", ch);}else{fprintf(labelfilename, "\n%s", ch);}flg++;}fclose(labelfilename);system("pause");return 0; }//從txtPathName截取最后一個“\\”后與“.”之前的部分名稱 void getTxtPartName (char *partName, string txtPathName) {char tmpChar1[1024]={'0',};char tmpChar2[1024]={'0',};strcpy(tmpChar1, txtPathName.c_str());int pathNameLen = strlen(tmpChar1); int pos = pathNameLen; while (pos > 0) {pos--; if (tmpChar1[pos] == '\\') {pos++; break;} }memcpy(tmpChar2, tmpChar1 + pos, pathNameLen-pos); pos = strlen(tmpChar2); while (pos > 0) {if (tmpChar2[pos] == '.') break; pos--; }tmpChar2[pos] = 0; sprintf(partName, "%s", tmpChar2); }4.2、指定行數拆分代碼
#include <iostream> #include <string> #include <fstream>using namespace std;//待處理樣本的路徑 #define TXT_PATH_NAME "..\\Inputs\\List.txt"void getTxtPartName (char *partName, string txtPathName) ;int main() {//統計txt中的總行數ifstream countSamplesNum(TXT_PATH_NAME);string samplesPathName;int eachSplitGroupLineNum[100]; //保存各份的行數int samplesNum = 0; //txt中的總行數int splitNum = 0; //計劃拆分的份數//循環讀取txt的各行while (1) {if (!getline(countSamplesNum,samplesPathName)) {break;}if (samplesPathName.empty()) {continue; }samplesNum++;}cout<<"輸入txt的總行數:"<<samplesNum<<endl;cout<<"請輸入拆分數量:";cin>>splitNum;cout<<endl<<endl<<"請依次輸入"<<splitNum<<"份的行數:"<<endl;for (int i=0; i<splitNum; i++){cin>>eachSplitGroupLineNum[i];}cout<<endl<<endl;char dispParams[1024]; //讀入原文件的名字char saveNameExt[1024]; //保存新文件的名字,源文件加數字getTxtPartName(dispParams, TXT_PATH_NAME); //從輸入txt的路徑獲取txt文件名//實現拆分,文件保存ifstream totalSamplesPath(TXT_PATH_NAME);string singleSamplesPath;for (int i=0; i<splitNum; i++){sprintf(saveNameExt, "%s_%d.txt", dispParams, i);FILE *labelfilename = fopen(saveNameExt, "w+t");for (int j=0; j<eachSplitGroupLineNum[i]; j++){getline(totalSamplesPath, singleSamplesPath);const char* ch=singleSamplesPath.c_str();if (j==0){fprintf(labelfilename, "%s", ch);} else {fprintf(labelfilename, "\n%s", ch);}}fclose(labelfilename);}system("pause");return 0; }//從txtPathName截取最后一個“\\”后與“.”之前的部分名稱 void getTxtPartName (char *partName, string txtPathName) {char tmpChar1[1024]={'0',};char tmpChar2[1024]={'0',};strcpy(tmpChar1, txtPathName.c_str());int pathNameLen = strlen(tmpChar1); int pos = pathNameLen; while (pos > 0) {pos--; if (tmpChar1[pos] == '\\') {pos++; break;} }memcpy(tmpChar2, tmpChar1 + pos, pathNameLen-pos); pos = strlen(tmpChar2); while (pos > 0) {if (tmpChar2[pos] == '.') break; pos--; }tmpChar2[pos] = 0; sprintf(partName, "%s", tmpChar2); }總結
以上是生活随笔為你收集整理的【C/C++】等分或指定行数把txt文档拆分成多份的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】欧几里德算法快速求最大公约数
- 下一篇: 数据挖掘之3种数据归一化方法及代码实现