从文件中读取文本的问题。获得双重阅读
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, '|');
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, '|');