C:使用substr解析文本文件

时间:2013-04-27 16:26:58

标签: c++ file parsing substr

我只需要一点文件解析帮助。我们必须解析一个文件,每行有6个字符串条目,格式为:

“string1”,“string2”,“string3”,“string4”,“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个字符串读入字符串数组。有人可以帮助我完成整个过程吗?

2 个答案:

答案 0 :(得分: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 :: find来查找结束语:

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

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

然后我们有两个引用位置start..end,因此我们使用substr来提取字符串:

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

然后我们将下一个循环的start更新为最后一个结束语:

    start = end

答案 1 :(得分:0)

请为您自己创建一个最小的例子。这从一个字符串开始,就像你给出的行一样,以数组中的不同部分结束。暂时从文件中取出加载,getline()似乎适合你,或者?然后,不要在函数开头声明您可能想要使用的每个变量。这不是古老的C,您只需要这样做或引入额外的{}块。还有一件事奇怪,那就是Book bookPtr[]。这确实只是一个Book* bookPtr,即你没有将数组传递给函数而只是一个指针。不要因为这种误导性的语法而堕落,这是谎言!无论如何,你似乎并没有使用那个指向未知类型对象的指针。

关于将一条线分成字符串,一种方法是找到双引号对。介于两者之间的所有东西都是其中的一个,没有任何东西是无关紧要的。字符串类有一个find()函数,它可以选择一个起始位置。起始位置总是落后于之前找到的位置。

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

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