2017-04-20 56 views
1

我正在使用两行文本文件。每行有几千个数字(有符号双打)。所以它看起来像这样:有没有办法请求在C++中读取文本文件的某个位置?

X.11 X.12 X.13 ... 
X.21 X.22 X.23 ... 

对于我的程序的每个循环,我想从每行读取一个数字。因此,对于循环的第一次迭代,将是X.11 & X.21和第二次迭代X.12 & X.22等等。我不需要存储这些值。

预期输出:

X.11 X.21 
X.12 X.22 
X.13 X.23 

如何能在C++做什么? 我通常使用fstream读取文件,并逐行读取文件std::getline(file, line)。我将如何从每一行读取一个数字?

+3

X.11和X.12应该是X.11&X.21? – CIsForCookies

+1

你可以做你想做的事情,但编写一个程序来完成整个文件的转置可能会更容易,然后逐行读取它。 –

+0

你的号码长度和线路长度是否固定?在这种情况下,您可以计算下一列的起始位置并使用[seekg](http://www.cplusplus.com/reference/istream/istream/seekg/)(请求导致示例看起来像是......) – urban

回答

1

我假设你需要:我想读每行一个号码。
否则评论我;我将删除答案。

与2个流阅读文件并联:

std::ifstream input_file_stream_1("file"); 
std::ifstream input_file_stream_2("file"); 

std::string line_1; 
std::string line_2; 
std::string ignore; 
std::getline(input_file_stream_2, ignore); // ignore the whole first line 

for(; input_file_stream_1 >> line_1 && input_file_stream_2 >> line_2;){ 
    std::cout << line_1 << " and " << line_2 << '\n'; 
} 

input_file_stream_1.close(); 
input_file_stream_2.close(); 

输入:

X.11 X.12 X.13 ... 
X.21 X.22 X.23 ... 

输出:

X.11 and X.21 
X.12 and X.22 
X.13 and X.23 
... and ... 

它是如何工作的?
由于您的文件只有2行,所以我在同一个文件中使用了两个input_stream。其中一个是第一行,另一个是第二行。但在去循环之前。 input_file_stream_2读取第一行,因为input_file_stream_1想要读取此内容,所以不需要使用该行。所以忽略该行后(第一行)。 input_file_stream_1具有第1行,input_file_stream_2具有第2行。现在,您有两行具有流。

std::ifstream input_file_stream("file"); 

std::string line_1; 
std::string line_2; 
std::getline(input_file_stream, line_1); 
std::getline(input_file_stream, line_2); 

std::regex regex(R"(\s+)"); 
std::regex_token_iterator<std::string::iterator> begin_1(line_1.begin(), line_1.end(), regex, -1), end_1; 
std::regex_token_iterator<std::string::iterator> begin_2(line_2.begin(), line_2.end(), regex, -1), end_2; 

while(begin_1 != end_1 && begin_2 != end_2){ 
    std::cout << *begin_1++ << " and " << *begin_2++ << '\n'; 
} 

input_file_stream.close(); 

输出::(与上面相同)而在for循环,(或同时),你可以通过>>操作


std::regex库提取每个文本

X.11 and X.21 
X.12 and X.22 
X.13 and X.23 
... and ... 

注意:
有多种方法来此

+0

谢谢。你能解释第一种方法中的循环吗?没有迭代器它如何工作? – Hadi

+1

@哈迪是的。我会做的 –

1

如果您已经阅读使用std::getline(file, line)行了,你可以把你得到的字符串,以及令牌化它char* p = strtok (yourline, " ");,然后* P会导致第一线十.11,并为下一个,你再打电话来strtok

1

对于fstream,您可以使用tellgseekg来存储和恢复流中的位置。但是,我还没有证实它们与格式化输入一起工作良好。

假设您不想将结果存储在内存中,并且只有两行,另一种解决方案是将文件打开两次 - 并将其视为正在读取来自两个不同文件的行。

2

我不需要存储这些值。

当然,但如果你确实说了两个双打数组,那么你的循环将是微不足道的,而且比普通磁盘读取要快得多。而两个几千个双打数组可能会比你想象的要少的内存使用量。 1 Mb的RAM可以包含131072个8字节的双倍数据。

相关问题