从文件中读取文本的问题。获得双重阅读

Issues reading text from a file. Getting double reads

Whosebug 的朋友们大家好!

我编写了一个将 3 个字符串保存到文本文件的程序。要写的代码是:

void my_class::save_file(const char* text) {
    for(auto ad: ad_list) {
        std::ofstream outputFile;
        outputFile.open(text, std::ios::app);
        if (outputFile.is_open()) {
            outputFile << ad.string1 << "|" << ad.string2 << "|" << ad.string3 << "|" << std::endl;
            outputFile.close();
        }
    }
}

这给了我包含以下内容的文件:

string1|string2|string3|
   <- //extra line here

当我从这个文件中读取时,我使用以下函数进行读取:

void my_class::read_file(const char* text) {
    // read file to stringsteam
    std::stringstream ss;
    std::ifstream fp (text);
    if (fp.is_open()) {
        ss << fp.rdbuf(); 
    }
    fp.close();
    string file_contents = ss.str();

    // split to lines
    auto lines = splitString(file_contents, "\n");

    // split to parts
    for (auto ad_text: lines) {   // <-- this is the possibly the issue
        auto ad_parts = splitString(ad_text, "|");
        string string1 = ad_parts[0];
        string string2 = ad_parts[1];
        string string3 = ad_parts[2];
        auto new_class = MyClass(string1, string2, string3);
        //Adds (push_back) the class to its vector
        add_class(new_class);
    }
}

vector<string> my_class::splitString(string text, string delimiter) {
    vector<string> parts;
    size_t start = 0;
    size_t end = 0;
    while((end = text.find(delimiter, start)) != std::string::npos) {
        size_t length = end - start;
        parts.push_back(text.substr(start, length));
        start = end + delimiter.length();
    }
    start = end + delimiter.length();
    size_t length = text.length() - start;
    parts.push_back(text.substr(start, length));

    return parts;
}

结果:

string1|string2|string3|
string1|string2|string3|

我很确定这个副本是写入函数留下的新行的结果。 read 函数将文本分成几行,这将是 2 行。 我目前正在拆分此循环中的行“for (auto ad_text: lines)”,我想做的基本上是 ( lines - 1 )。我不明白如何通过 for 循环进行交互的方式来做到这一点。

提前致谢!

您可以简化您的splitString函数,使其如下所示。注意 splitString 的第二个参数现在是 char 而不是 std::string.

//note the second parameter is a char and not a string now 
vector<string> splitString(string text, char delimiter) {
    vector<string> parts;
    std::string words;
    std::istringstream ss(text);
    while(std::getline(ss, words,delimiter ))
    {
         parts.push_back(words);
    }
   
    return parts;
}

要使上述修改生效,您必须进行 2 次额外更改

更改1:将auto lines = splitString(file_contents, "\n");替换为:

auto lines = splitString(file_contents, '\n');

改2:将auto ad_parts = splitString(ad_text, "|");替换为:

 auto ad_parts = splitString(ad_text, '|');