C:使用substr解析文本文件

C : Using substr to parse a text file

本文关键字:文本 文件 substr 使用      更新时间:2023-10-16

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

"string1"、"string2相等"、"string3"、"沙漠西部边缘一溜排开"、"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个字符串读取到字符串数组中。有人能帮我介绍一下这个过程吗?

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,指向虚构的"-1"元素的右引号。)

所以我们从最后一个结束引号向前推进到下面的开始引号:

    start += 3;

然后使用std::string::find查找右引号:

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

偏移量告诉它忽略该位置以下的所有字符。

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

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

然后我们将下一个循环的start更新为最后一个闭引号:

    start = end

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

关于将一行分割成字符串,一种方法是定位双引号对。一切在中间的都是一根弦,一切不在中间的都是不相干的。string类有一个find()函数,该函数可选地接受起始位置。起始位置总是比前面找到的位置低1。

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

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