2014-10-01 49 views
0

好吧,所以它已经有一段时间了,因为我搞砸了读写文件,而我忘记了所有我学到的东西。所以,我现在只是想弄清楚如何从文本文件中读取特定的行并将该行输出到命令提示符中。这里是我的代码,我有问题:如何阅读使用C++的文本文件的个别行

#include <iostream> 
#include <fstream> 
using namespace std; 

int main(){ 
ifstream input; 
int lineN=0; 
string line[lineN]; 
input.open("input.txt"); 

getline(input, line[lineN]); 
cout << line[lineN]; 
} 

因为它目前是,它会读取文本文件的第一行没有问题。但是,如果我将变量lineN(代表行号)更改为1以读取第二行,则会使提示崩溃。我不知道我做错了什么。我试图研究这个问题,但每个人的回答都太模糊了(或者我太愚蠢了)。如果你能帮助我,那会很棒。

+0

串线[5]将定义大小5的阵列,与易访问索引[0] - [4],注[5]是_not_有效指数。你的程序不会与lineN = 1一起崩溃纯粹是“幸运”。不管怎样,这只是告诉getline在哪里存储它读取的内容 - 而不是从何处读取它。您将始终以这种方式阅读文本文件的第一行。如果不是再次尝试学习范围和函数调用的基础知识,那么getline永远不会掌握“lineN”的值对你来说应该是绝对明显和不言而喻的。 – cooky451 2014-10-01 16:57:51

+1

'getline(input,line [lineN]);' - 您正在访问数组边界外的元素,导致未定义的行为。 – 2014-10-01 16:58:37

+0

这甚至不应该编译:'std :: string line [lineN];'在C++中不合法。你正在用C++编译,不是吗? (对于我所知道的所有编译器,您需要特殊的选项才能在C++中进行编译,而不是从C++派生的某种自定义语言中。) – 2014-10-01 17:23:46

回答

3

的问题是,您在此处定义字符串的空数组和数组不是动态:

int lineN=0; 
string line[lineN]; 

当您更改lineN 1,什么数组中的变化,你会摆脱束缚!

的bettter方式是使用vectors

vector<string> line; 

读入一个临时字符串:

string current_line; 
getline(input, current_line); 

,并把它添加到您的载体:

line.push_back(current_line); 

把所有这一切在一个不错的循环会更有用:

string current_line; 
while (getline(input, current_line)) { 
     line.push_back(current_line); 
} 

您可以稍后访问任何行,只要使用line[i]与您的数组完全一样,只要i< line.size()。或者,你可以轻松地重复通过量全部内容:

for (string x : line) { // means for every x in line[] 
    cout<< x<<endl; 
}