C++ 如何以这种特定的方式读取和处理文件中的文本?
我有一个关于处理我正在阅读的文件中的一些名称或数字的代码的问题。因此,文件中的文本如下所示:C++ 如何以这种特定的方式读取和处理文件中的文本?,c++,file,input,getline,C++,File,Input,Getline,我有一个关于处理我正在阅读的文件中的一些名称或数字的代码的问题。因此,文件中的文本如下所示: Imp;1;down;67 Comp;3;up;4 Imp;42;right;87 如您所见,有3行文字和数字由字符“;”分隔。我希望一次读取每一行,并将整个字符串拆分为一行中的单词和数字,然后处理信息(将用于使用数据创建新对象)。然后转到下一行,依此类推,直到EOF 因此,我想阅读第一行文本,将其拆分为一个由行中的单词和数字组成的字符串数组,然后用它们创建一个类的对象。例如,对于第一行,创建一个类I
Imp;1;down;67
Comp;3;up;4
Imp;42;right;87
如您所见,有3行文字和数字由字符“;”分隔。我希望一次读取每一行,并将整个字符串拆分为一行中的单词和数字,然后处理信息(将用于使用数据创建新对象)。然后转到下一行,依此类推,直到EOF
因此,我想阅读第一行文本,将其拆分为一个由行中的单词和数字组成的字符串数组,然后用它们创建一个类的对象。例如,对于第一行,创建一个类Imp的对象,如下所示impobjimp(Imp,1,down,67)
在Java中,我使用
information=line.split(;”)
(其中line是一行文本),然后使用information[0]
,information[1]
访问字符串数组的成员并创建对象。我在这里也试着这么做不要使用char
数组作为缓冲区,还有。已经说过了,让我们继续解决这个问题
与类似,只是它使用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;
}
}
#包括
#包括
#包括
#包括
...
std::ifstream myFile(“D:\\stuff.txt”);//一句话
如果(myFile.is_open()){
std::字符串行;
而(std::getline(myFile,line)){//逐行读取
std::istringstream line\u stream(line);
std::字符串输出;
while(std::getline(line_-stream,output,“;”)//行解析
std::cout不要使用char
数组作为缓冲区,并且。已经说过,让我们继续解决这个问题
与类似,只是它使用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;
}
}
#包括
#包括
#包括
#包括
...
std::ifstream myFile(“D:\\stuff.txt”);//一条语句
如果(myFile.is_open()){
std::字符串行;
而(std::getline(myFile,line)){//逐行读取
std::istringstream line\u stream(line);
std::字符串输出;
while(std::getline(line_-stream,output,“;”)//行解析
标准::cout另一种(略有不同)选择:
/*
* 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;向下;67
*“小鬼”,“1”,“向下”,“67”
*行:Comp;3;up;4
*“综合”、“3”、“上升”、“4”
*行:Imp;42;右;87
*“小鬼”、“42”、“右”、“87”
*行:Imp;42;右;87
*“小鬼”、“42”、“右”、“87”
*/
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
void split(常量std::string&s、char delim、std::vector&fields)
{
字段。清除();
标准::stringstream ss(s);
std::字符串项;
while(std::getline(ss,item,delim)){
字段。推回(项目);
}
}
无效打印(标准::矢量和字段)
{
cout另一种(略有不同)选择:
/*
* 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;向下;67
*“小鬼”,“1”,“向下”,“67”
*行:Comp;3;up;4
*“综合”、“3”、“上升”、“4”
*行:Imp;42;右;87
*“小鬼”、“42”、“右”、“87”
*行:Imp;42;右;87
*“小鬼”、“42”、“右”、“87”
*/
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
void split(常量std::string&s、char delim、std::vector&fields)
{
字段。清除();
标准::stringstream ss(s);
std::字符串项;
while(std::getline(ss,item,delim)){
字段。推回(项目);
}
}
无效打印(标准::矢量和字段)
{
你的代码会读一行,打印出来,然后重复,直到没有东西可以读。这符合你对事情的描述,我想…那有什么问题吗?它不会在第一行之后停止,所以我可以插入我需要的代码——嗯,嗯?你根本没有很好地描述你的问题,而且你似乎没有添加任何内容处理行(output
)而不是打印它的代码。在getline
中使用常量256
会导致崩溃。应该使用sizeof(output)
这里。@mah我没有解释我要做什么,让我再试一次。因此,我想阅读第一行文本,将其拆分为一个由该行中的单词和数字组成的字符串数组,然后用它们创建一个类的对象。例如,对于第一行,创建一个类Imp的对象,如下Imp objImp(Imp,1,down,67)
.I Java我用“information=line.split(;”)(其中line是一行文本)做了同样的事情,然后用“information[0]”,information[1]'访问字符串数组的成员并创建对象。我正在尝试执行相同的操作here@Logicrat-这只是为了测试,但也要感谢你的提醒。请看:看起来你的代码只读取一行,打印出来,然后重复,直到没有任何内容可读。这与你对事情的描述相匹配,我认为……那么,问题出在哪里?它不会在第一行之后停止,这样我就可以插入我需要的代码——嗯,嗯?你根本没有很好地描述你的问题,而且你似乎没有添加任何代码