读一行文件c ++

时间:2014-11-02 10:47:32

标签: c++ file fstream

我只是想尝试使用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;
            }

        }
    }

}

还有其他办法吗?

2 个答案:

答案 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;
    }
}