我只是想尝试使用fstream库,我想读一行。 我想到了这一点,但我不知道是否是最有效的方式。
#include <iostream>
#include <fstream>
using namespace std;
int main(){
int x;
fstream input2;
string line;
int countLine = 0;
input2.open("theinput.txt");
if(input2.is_open());
while(getline(input2,line)){
countLine++;
if (countLine==1){ //1 is the lane I want to read.
cout<<line<<endl;
}
}
}
}
还有其他办法吗?
答案 0 :(得分:2)
这似乎不是最有效的代码,没有。
特别是,您正在读取整个输入文件,即使您只关心文件的一行。不幸的是,做好跳绳是很困难的。很多人建议使用以下代码:
your_stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
......为了这份工作。这可行,但有一些缺点。首先,如果你试图在一个非文本文件(特别是那个不包含新行的文件)上使用它,它可能会浪费大量的时间来阅读整个巨大的文件,很久你已经阅读了足够多的文件通常会意识到一定有问题。例如,如果您正在阅读“行”,那么这是一个非常好的迹象表明您期望一个文本文件,并且您可以非常轻松地设置一个更低的限制,即第一行可以合理地存在多长时间,例如(比如说)一兆字节,通常比那还少很多。
您通常还想检测它是否因为达到最大值而停止读取,或者因为它到达了行的末尾。仅当在达到指定的最大值之前遇到换行符时,才会跳过一行“成功”。为此,您可以使用gcount()
与指定的最大值进行比较。如果由于达到指定的最大值而停止读取,则通常需要停止处理该文件(并记录错误,打印出错误消息等)。
考虑到这一点,我们可能会编写这样的代码:
bool skip_line(std::istream &in) {
size_t max = 0xfffff;
in.ignore(max, '\n');
return in.gcount() < max;
}
根据具体情况,您可能更愿意将最大行大小作为参数传递(可能使用默认值):
bool skip_line(std::istream &in, size_t max = 0xfffff) {
// skip definition of `max`, remainder identical
有了这个,你可以默认跳过一个兆字节,但如果你想指定一个不同的最大值,你可以很容易地做到这一点。
无论哪种方式,在定义的情况下,余数变得相当微不足道,如下所示:
int main(){
std::ifstream in("theinput.txt");
if (!skip_line(in)) {
std::cerr << "Error reading file\n";
return EXIT_FAILURE;
}
// copy the second line:
std::string line;
if (std::getline(in, line))
std::cout << line;
}
当然,如果你想跳过多行,你可以通过将skip_line
的调用放在循环中来轻松完成 - 但请注意,您通常仍希望测试结果从它,并打破循环(并记录错误),如果它失败。您不通常需要以下内容:
for (int i=0; i<lines_to_skip; i++)
skip_line(in);
有了这个,你将失去一个基本的好处,即确保你的输入真的是你所期望的,而且你不会产生垃圾。
答案 1 :(得分:0)
我认为您可以将代码浓缩为此。 if (input)
足以检查失败。
#include <iostream>
#include <fstream>
#include <limits>
int main()
{
std::ifstream input("file.txt");
int row = 5;
int count = 0;
if (input)
{
while (count++ < row) input.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::string line;
std::getline(input, line);
std::cout << line;
}
}