2015-02-11 51 views
0

所以我有一个文件,其中前3行将始终引用“状态”,其余部分将引用“转换”我知道前3行将始终以相同的格式,并在同一行上的投入,但“过渡”的个数之间的标签是未知的,但在文件中读取和解析输入

for(int i = 0; i < 3; i++){ 
    myFile >> junk; 
    myFile >> stateNum; 
    myFile >> designation; 
    //make object and put in container 
} 

现在在线4

所以我处理的“状态”永远启动我需要处理“转换”,所以如果我的输入文件看起来像

state 1 a 
state 2 b 
state 3 c 
trans a b c d & 
trans d s i & 3 
... 
trans 4 e & d g 

其中同一行上的所有空格都是制表符,状态/转换进入junk,因为它们不是必需的,因为我知道1-3是状态,其余是转换。我现在如何从行4开始并继续直到文件结束?基本上,if条件做我使用,使这项工作

if(???){ 
    myFile >> junk; 
    myFile >> one; 
    myFile >> two; 
    ... 
    myFile >> five; 
    //create object and place in container 
} 

,其中一,二,......五个早些时候宣布,一个,...,五对应5个条目后“反式”

+1

什么读线成一条线串(函数getline),并与istringstream解析参数(使用当前行字符串)? – 2015-02-11 22:23:19

+0

如果你的输入行的语法确实如图所示,'trans'不是*“垃圾”。以*开始的行* not *不能是一个转换,并且循环读取转换应该终止。 – WhozCraig 2015-02-11 23:00:17

+0

@WhozCraig输入非常受控,文本文件中不会有错误。如果这是产品代码或我完全同意,但我知道在这种情况下格式将永远是正确的 – 2015-02-12 19:07:24

回答

0

尝试将

myFile >> junk; 
myFile >> stateNum; 
myFile >> designation; 

循环之前,然后再读一个循环内的每个过渡,因为你while循环不知道有多少个会。

+0

以及我需要循环与垃圾,stateNum和指定绕过3次,所以我可以写出来9次,但它很高兴在一个循环中,尤其是因为在循环内我有3个'if'语句,取决于名称 – 2015-02-11 22:23:48

+0

啊,好的,我没有仔细阅读你的问题 - 对于循环类型是有意义的然后(但使用getline三次并解析该行会更整洁)。一旦完成三条状态线的循环,您将需要一个用于转换的while循环。 – 2015-02-11 22:27:31

0

正如迪特尔说,你应该通过线路上使用stringstream的和函数getline

string line; 

while (getline (myFile, line)){ 
//this will loop until the end of the file 
    stringstream line_stream(line); 
    string word; 
    while (line >> word){ 
    //this will loop until there are words (transitions) on the line) 
    //(your code) 
}