C++ 需要将文本的特定行写入新文本

C++ 需要将文本的特定行写入新文本,c++,string,list,sorting,text,C++,String,List,Sorting,Text,我的数字文本数据行大小在1mb-150MB之间,我需要写与高度相关的数字行,例如:高度=4,新文本必须包括行:1,5,9,13,17,21。。。。必然地 我一直在寻找一种方法来实现这一点已经有一段时间了,尝试使用列表而不是向量,最终导致编译错误 我已按照建议清理了代码。它现在写入所有行sample2文本,全部在这里完成。谢谢大家 我是开放的方法改变,只要它提供了我需要的,谢谢你的时间和帮助 以下是我目前的情况: #include <iostream> #include <fst

我的数字文本数据行大小在1mb-150MB之间,我需要写与高度相关的数字行,例如:高度=4,新文本必须包括行:1,5,9,13,17,21。。。。必然地

我一直在寻找一种方法来实现这一点已经有一段时间了,尝试使用列表而不是向量,最终导致编译错误

我已按照建议清理了代码。它现在写入所有行sample2文本,全部在这里完成。谢谢大家

我是开放的方法改变,只要它提供了我需要的,谢谢你的时间和帮助

以下是我目前的情况:

#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <vector>

using namespace std;

int h,n,m;
int c=1;

int main () {

cout<< "Enter Number Of Heights: ";
cin>>h;

ifstream myfile_in ("C:\\sample.txt");
ofstream myfile_out ("C:\\sample2.txt");
string line;
std::string str;
vector <string> v;
if (myfile_in.is_open()) {
myfile_in >> noskipws;
int i=0;
int j=0;
while (std::getline(myfile_in, line)) {
v.push_back( line );
++n;
if (n-1==i) {
myfile_out<<v[i]<<endl;
i=i+h;
++j;
}
    }
cout<<"Number of lines in text file: "<<n<<endl;
}

else cout << "Unable to open file(s) ";

cout<< "Reaching here, Writing one line"<<endl;

system("PAUSE");
return 0; 
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int h,n,m;
int c=1;
int main(){
cout>h;
ifstream myfile_in(“C:\\sample.txt”);
将myfile_输出(“C:\\sample2.txt”);
弦线;
std::字符串str;
向量v;
if(myfile_in.is_open()){
myfile_in>>noskipws;
int i=0;
int j=0;
while(std::getline(myfile_in,line)){
v、 向后推(线);
++n;
如果(n-1==i){
myfile_out您需要使用设置文件开头的位置,一旦您阅读了它(您已经阅读了一次,以计算行数(我认为您实际上不需要,因为至少在这段代码中从未使用过此大小)

如果内部<代码>在<代码>时,有什么意义?在每个循环上,您都有

int i=1;
myfile_out<<v[i]; //Not writing to text
i=i+h;
之前,请参见kg
以清除标志

此外,您的算法是错误的。如果h>1,您将得到seg故障,因为您将超出(向量的)范围。我建议这样做:在计算行数的同时读取
中的文件。并将每行存储在向量中。这样,您就可以删除第二次读取,
seekg
clear
,等等。此外,由于您已经将文件内容存储到
向量中,因此不会丢失任何内容。然后使用
用于
循环步骤
h


再次编辑,关于您的编辑:不,它与任何标志无关。比较
i==j
if
在while之外。将其添加到while之内。此外,在
if
之外增加
j
。或者只需删除
j
,并使用
n-1
即可。如

if ( n-1 == i )

<如果在C++中没有绝对的理由来做这件事,那么你就使用了错误的编程语言。在AWK中,你的整个程序是:

{ if ( FNR % 4 == 1 ) print; }
或者,将整个命令行(例如,在sh中)赋予过滤行1、5、9、13、…:

awk '{ if ( FNR % 4 == 1 ) print; }' a.txt > b.txt
有几件事

首先,您完全读取文件,只是为了计算行数, 然后你再读一遍来处理它,在内存中建立一个 在
v
中创建图像。为什么不在第一时间阅读它,然后做所有事情呢 内存映像中的其他内容?(
v.size()
然后将为您提供号码 行数,因此您不必计算它们。)

而且你从来没有用过计数

第二,当您第一次到达文件末尾时
failbit
已设置;在重置之前,所有后续操作均为无操作。 如果您必须读取文件两次(例如,因为您删除了
v
完全),然后您必须在第一次之后执行
myfile\u in.clear()
循环,但在开始查找之前

只有在读取一次文件后,才能测试
是否处于打开状态
应在打开后立即打开

您还可以设置
noskipws
,尽管您不进行任何格式化输入 这会受到它的影响

最后的
while
非常可疑。因为您没有完成
清除
,你可能永远不会进入循环,但如果你进入了,你会非常失望 快速开始访问越界:读取n行后,大小 of
v
将是n,但您可以使用索引
i
来读取它,该索引将是
n*h

最后,应该显式关闭输出文件并检查 收盘后出现错误,以防万一

我不清楚你想做什么如果你只想 在每个现有行之间插入
h
空行,如:

std::string separ( h + 1, '\n' );
std::string line;
while ( std::getline( myfile_in, line ) ) {
    myfile_out << line << separ;
}
不过,其他工具似乎更合适 建议并使用AWK。)为什么要用你不懂的语言编写程序
很清楚什么时候可以使用工具来完成这项工作。

“恒定高度添加”??请重新表述您的问题。在当前状态下不可理解感谢您的输入,我正在尝试从文本中提取一些行并将其写入另一行…我已清理了先前的代码,以便只阅读一次
系统(“暂停”)
表示提问者在windows上运行它。因此使用
sed是一个奇怪的建议遵循thiton的建议可能是最简单的事情,但我对awk一无所知。它会从我的文本文件中读取并写入新的文本文件吗?@tyz我经常在Windows上使用
sed
:-)。毫无疑问,有一些与本机Windows相当的东西可以替代它,但我还没有找到。你肯定没有找到如果你要在平台上开发软件,我会使用这种功能的工具包。这可能是最简单的事情,但我对awk一无所知。它会从我的文本文件中读取并写入新的文本文件吗?是的,这是基本的操作模式。假设你有一个文本文件a.txt,想写入b.txt,命令行awk'{if(FNR%4==1)print;}'a.txt>b.txt执行此任务。
std::string separ( h + 1, '\n' );
std::string line;
while ( std::getline( myfile_in, line ) ) {
    myfile_out << line << separ;
}
std::string line;
while ( std::getline( myfile_in, line ) ) {
    myfile_out << line << '\n';
    for ( int count = h - 1; h > 0; -- h ) {
        std::getline( myfile_in, line );
        //  or myfile_in.ignore( INT_MAX, '\n' );
    }
}