需要将文本的特定行写入新文本
我有数字文本数据行,大小在1mb-150mb之间,我需要写出与高度有关的数字行,例如:heights = 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;
}
回答:
您需要使用seekg
设置在文件的开头位置,一旦你读它(您曾经阅读,计数线(我不认为你确实需要,因为这个尺寸是从来没有使用过,至少在这段代码)
,什么是点如果内部while
?在每个循环中,你有
int i=1; myfile_out<<v[i]; //Not writing to text
i=i+h;
因此,在每个循环中,i
获得1,因此您始终输出索引为1
的元素。这不是第一个因素,因为指数从0
开始。所以,一旦你把seekg
或删除第一个while
,你的程序将开始崩溃。
因此,使i
从0
开始。并从循环中取出它,就在if-statement
的开头。
嗯,第二个while
也是不必要的。只留下第一个。
编辑: seekg
之前添加
myfile_in.clear();
清除标志。
另外,你的算法是错误的。如果h> 1,你会得到seg故障,因为你会超出范围(矢量)。我建议这样做:读取while
中的文件,这些文件包含在内。并将每行存储在向量中。通过这种方式,您可以删除第二个阅读文本,seekg
,clear
等。此外,由于您已将文件内容存储到vector
,因此您不会丢失任何内容。然后,使用for
循环与步骤h
。
再次编辑,关于你的编辑:不,它与任何标志无关。 if
,你比较i==j
是在时间之外。把它添加进去。另外,在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_in.clear()
后第一个 循环,但在寻求开始之前。
您仅在读取一次文件后才测试is_open
。这个测试 应该在打开后立即进行。
您还设置了noskipws
,虽然您不会进行任何格式化输入 ,它会受到它的影响。
最后的while
是高度怀疑。因为你还没有完成 clear
,你可能永远不会进入循环,但如果你这样做,你会很快开始访问越界:读取n行后,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;
}
应该做的伎俩。无需将完整的输入存储在内存中。 (对于这个问题,你甚至不必为此编写程序。 简单的sed 's:$:\n\n\n\n:' <infile> outfile
会做 的窍门。)
编辑:
阅读其他答复,据我了解,我可能误解了 问题,他只希望输出每h
n行。如果这是 的情况:
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');
}
}
但是,其他工具似乎更合适。 (我会遵循thiton的 建议并使用AWK。)为什么用一种你不懂的语言编写程序时,你知道何时可以使用工具来完成这项工作。
以上是 需要将文本的特定行写入新文本 的全部内容, 来源链接: utcz.com/qa/267110.html