2013-04-27 96 views
1

我只需要一点帮助文件解析。我们必须解析以格式,每行6个项的文件:C:使用substr解析文本文件

“字符串1”,“字符串2”,“STRING3”,“串,4”,“STRING5”,“string6”

我的教练最近给了我们一小段代码作为“提示”,我应该使用它。不幸的是,我无法弄清楚如何让它起作用。这是我的文件解析功能。

void parseData(ifstream &myFile, Book bookPtr[]) 
{ 

    string bookInfo; 
    int start, end; 
    string bookData[6]; 

    getline(myFile, bookInfo); 
    start = -2; 

    myFile.open("Book List.txt"); 

    for (int j = 0; j < 6; j++) 
    { 
     start += 3; 
     end = bookInfo.find('"', start); 
     bookData[j] = bookInfo.substr(start, end-start); 
     start = end; 
    } 



} 

所以我试图将6个字符串读入一个字符串数组。有人能帮助我完成整个过程吗?

+1

你的老师给了你那段代码。我建议你改变课程,因为这是一个非常糟糕的方式去做。 – 2013-04-27 17:39:32

+0

我同意詹姆斯。我已经列出了解析引用字符串多行文件的“更好”方法。这并不完美,但它远比教练给你的“提示”要好得多(这是一个“暗示”可以肯定的问题,但与熟练程度有关,而不是解决这个特定问题)。 – WhozCraig 2013-04-27 18:02:26

回答

1
start = -2; 
for (int j = 0; j < 6; j++) 
{ 
    start += 3; 
    end = bookInfo.find('"', start); 
    bookData[j] = bookInfo.substr(start, end-start); 
    start = end; 
} 

所以", "是四个字符。前导收盘价是在开盘收盘价后面3个字符。

进入循环start指向最后的结束报价。 (在第一次进入循环是伪造为-2是指向虚“-1th”元素的收盘报价。)

所以我们从最后收报价前进到开盘后报价:

start += 3; 

然后我们使用的std :: string ::找到找到收盘报价:

end = bookInfo.find('"', start); 

偏移告诉它忽略所有字符,直到并包括该位置。

然后,我们有两个引号位置,start..end,所以我们使用substr提取字符串:

bookData[j] = bookInfo.substr(start, end-start); 

然后我们下一个循环是最后结束引号更新开始:

start = end 
0

请为了你自己,创造一个最小的例子。这开始于一个字符串,就像你给出的例子的行,并以数组中的不同部分结束。现在离开文件加载,getline()似乎为你工作,或?然后,不要在函数的开头声明你想要使用的每个变量。这不是古老的C,你只需要这样做或引入额外的{}块。还有一件奇怪的事,那就是Book bookPtr[]。这实际上只是一个Book* bookPtr,即你不是将一个数组传递给一个函数,而只是一个指针。不要因为这个误导性的语法而失败,这是一个谎言!无论如何,无论如何,你似乎都不会使用该指针指向未知类型的对象。

关于将行分割为字符串,一种方法是找到双引号对。它们之间的一切都是字符串之一,没有任何东西是无关紧要的。字符串类有一个find()函数,它可以选择一个起始位置。起始位置始终位于先前找到的位置后面。

您上面的代码似乎假定只有一个双引号,逗号,空格和另一个双引号将两个字符串分开。这不是100%清楚,我也准备好处理多个空间或根本没有空间。此外,逗号是否有保证?双引号是否有保证?无论如何,保持简单。除非您对输入有更好的规范,否则只是假设只有引号之间的部分是不同的。

那么,究竟什么工作,什么不是?您需要提出更具体的问题并提供更详细的信息。上面的代码看起来本身并没有破坏,尽管有一些东西有点不合适。例如,您通常不会将ifstream传递给函数,而是使用istream基类。在你的情况下,你从该文件中读取一行,然后使用相同的fstream对象打开另一个文件,这对我来说是没有意义的,因为之后不使用它。如果你只在本地需要这个流,你可以在那里创建并打开它(当然是处理错误!)并且只传入文件名作为参数。