如何以这种特定方式读取和处理文件中的文本?
How to read and process text from a file in this specific way?
我对一些代码有疑问,这些代码用于处理我正在阅读的文件中的某些名称或数字。所以文件中的文本如下所示:
Imp;1;down;67
Comp;3;up;4
Imp;42;right;87
如您所见,有 3 行由字符“;”分隔的单词和数字.我想一次读取每一行,并将一行中的整个字符串拆分为 words 和 numbers ,然后处理信息(将用于用数据创建一个新对象)。然后移动到下一行,依此类推,直到 EOF。
所以,我想读取文本的第一行,将其拆分为由行中的单词和数字组成的字符串数组,然后从中创建一个 class 对象。例如,对于第一行,像这样 Imp objImp(Imp, 1, down, 67)
创建 class Imp 的对象。
在Java中,我使用information = line.split(";")'
(其中行是一行文本)做了同样的事情,然后使用information[0]
、information[1]
访问成员字符串数组并创建对象。我想在这里做同样的事情
不要使用 char
数组作为缓冲区,并且 don't use std::istream::eof
。说完了,继续解决问题
std::getline
is simmilar to std::istream::getline
,除了它使用 std::string
而不是 char
数组。
在两者中,参数 delim
表示定界字符,但在某种程度上它是字符,当遇到该字符时,std::getline
停止读取(不保存并丢弃)。这并不意味着它会神奇地在整行的每个 ;
之间为您拆分输入。
因此,您必须这样做:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
...
std::ifstream myFile("D:\stuff.txt"); // one statement
if (myFile.is_open()) {
std::string line;
while (std::getline(myFile, line)) { // line by line reading
std::istringstream line_stream(line);
std::string output;
while (std::getline(line_stream, output, ';')) // line parsing
std::cout << output << std::endl;
}
}
我们从line
构造一个std::istringstream
,所以我们可以用std::getline
再次解析它。
另一个(略有不同的)备选方案:
/*
* Sample output:
* line:Imp;1;down;67
* "Imp", "1", "down", "67"
* line:Comp;3;up;4
* "Comp", "3", "up", "4"
* line:Imp;42;right;87
* "Imp", "42", "right", "87"
* line:Imp;42;right;87
* "Imp", "42", "right", "87"
*/
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
void split(const std::string &s, char delim, std::vector<string> &fields)
{
fields.clear();
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
fields.push_back(item);
}
}
void print (std::vector<string> &fields)
{
cout << " ";
for (size_t i = 0; i < fields.size() - 1; i++)
cout << "\"" << fields[i] << "\", ";
cout << "\"" << fields[fields.size()-1] << "\"" << endl;
}
int main ()
{
std::ifstream fp("tmp.txt");
std::string line;
while (!fp.eof()) {
fp >> line;
cout << "line:" << line << endl;
std::vector<std::string> fields;
split(line, ';', fields);
print(fields);
}
fp.close();
return 0;
}
我对一些代码有疑问,这些代码用于处理我正在阅读的文件中的某些名称或数字。所以文件中的文本如下所示:
Imp;1;down;67
Comp;3;up;4
Imp;42;right;87
如您所见,有 3 行由字符“;”分隔的单词和数字.我想一次读取每一行,并将一行中的整个字符串拆分为 words 和 numbers ,然后处理信息(将用于用数据创建一个新对象)。然后移动到下一行,依此类推,直到 EOF。
所以,我想读取文本的第一行,将其拆分为由行中的单词和数字组成的字符串数组,然后从中创建一个 class 对象。例如,对于第一行,像这样 Imp objImp(Imp, 1, down, 67)
创建 class Imp 的对象。
在Java中,我使用information = line.split(";")'
(其中行是一行文本)做了同样的事情,然后使用information[0]
、information[1]
访问成员字符串数组并创建对象。我想在这里做同样的事情
不要使用 char
数组作为缓冲区,并且 don't use std::istream::eof
。说完了,继续解决问题
std::getline
is simmilar to std::istream::getline
,除了它使用 std::string
而不是 char
数组。
在两者中,参数 delim
表示定界字符,但在某种程度上它是字符,当遇到该字符时,std::getline
停止读取(不保存并丢弃)。这并不意味着它会神奇地在整行的每个 ;
之间为您拆分输入。
因此,您必须这样做:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
...
std::ifstream myFile("D:\stuff.txt"); // one statement
if (myFile.is_open()) {
std::string line;
while (std::getline(myFile, line)) { // line by line reading
std::istringstream line_stream(line);
std::string output;
while (std::getline(line_stream, output, ';')) // line parsing
std::cout << output << std::endl;
}
}
我们从line
构造一个std::istringstream
,所以我们可以用std::getline
再次解析它。
另一个(略有不同的)备选方案:
/*
* Sample output:
* line:Imp;1;down;67
* "Imp", "1", "down", "67"
* line:Comp;3;up;4
* "Comp", "3", "up", "4"
* line:Imp;42;right;87
* "Imp", "42", "right", "87"
* line:Imp;42;right;87
* "Imp", "42", "right", "87"
*/
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
void split(const std::string &s, char delim, std::vector<string> &fields)
{
fields.clear();
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
fields.push_back(item);
}
}
void print (std::vector<string> &fields)
{
cout << " ";
for (size_t i = 0; i < fields.size() - 1; i++)
cout << "\"" << fields[i] << "\", ";
cout << "\"" << fields[fields.size()-1] << "\"" << endl;
}
int main ()
{
std::ifstream fp("tmp.txt");
std::string line;
while (!fp.eof()) {
fp >> line;
cout << "line:" << line << endl;
std::vector<std::string> fields;
split(line, ';', fields);
print(fields);
}
fp.close();
return 0;
}