我需要将整个文件读入内存并将其放在C++中std::string.
如果我把它读成a char[],答案很简单:
std::ifstream t;
int length;
t.open("file.txt"); // open input file
t.seekg(0, std::ios::end); // go to the end
length = t.tellg(); // report location (this is the length)
t.seekg(0, std::ios::beg); // go back to the beginning
buffer = new char[length]; // allocate memory for a buffer of appropriate dimension
t.read(buffer, length); // read the whole file into the buffer
t.close(); // close file handle
// ... Do stuff with buffer here ...
Run Code Online (Sandbox Code Playgroud)
现在,我想做同样的事情,但是使用a std::string而不是a char[] …
有没有办法用另一个字符串替换所有出现的子字符串std::string?
例如:
void SomeFunction(std::string& str)
{
str = str.replace("hello", "world"); //< I'm looking for something nice like this
}
Run Code Online (Sandbox Code Playgroud) 相当不言自明,我尝试谷歌并得到了很多可怕的expertsexchange,我在这里搜索也无济于事.在线教程或示例是最好的.多谢你们.
如果我的文件是逗号分隔值,我如何从文件中读取数据
1, 2, 3, 4, 5\n
6, 7, 8, 9, 10\n
\n
Run Code Online (Sandbox Code Playgroud)
在读完文件后,我想将数据写回到上面相同格式的其他文件中.
我可以使用获得总行数
string line;
while(!file.eof()){
getline(file,line);
numlines++;
}
numline--; // remove the last empty line
Run Code Online (Sandbox Code Playgroud)
但我怎么知道一行/一行的总位数?
我还有一些存储数据的向量.所以,我想读取第一行,然后计算该行中元素的总数,这里是5(1,2,3,4,5)并将它们存储在数组/向量中,然后读取下一行并将它们存储在向量中再等等,直到我到达EOF.
然后,我想将数据写入文件,我想这将完成将数据写入文件的工作,
numOfCols=1;
for(int i = 0; i < vector.size(); i++)
{
file << vector.at(i);
if((numOfCols<5) file << ",";//print comma (,)
if((i+1)%5==0)
{
file << endl;//print newline after 5th value
numOfCols=1;//start from column 1 again, for the next line
}
numOfCols++;
}
file << endl;// last new line
Run Code Online (Sandbox Code Playgroud)
所以,我的主要问题是如何用逗号分隔值从文件中读取数据?
谢谢
我见过这个帖子:如何在C++中读取和解析CSV文件?
但重新发明轮子以获得像CSV解析器一样通用的东西似乎很愚蠢.Boost有一些便于解析的例程,但没有开箱即用的东西.
在其他地方,我看到与.NET相关的推荐库或其他特定于平台的库.很难相信没有一个首选的开放C++库可以为这个例程做点什么.
有什么建议?
我有这个代码,它应该在控制台中输入来自.csv文件的信息;
while(file.good())
{
getline(file, ID, ',');
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero, ' ') ;
cout << "Sexo: " << genero<< " " ;
}
Run Code Online (Sandbox Code Playgroud)
还有一个csv文件(当我用记事本打开时):
0,Filipe,19,M
1,Maria,20,F
2,Walter,60,M
Run Code Online (Sandbox Code Playgroud)
每当我运行程序时,控制台都会显示:

我的问题是为什么程序不是在每一行中重复那些cout消息而不是仅在第一行中重复
顺便说一句,nome是名字,idade是年龄,而genero/sexo是性别,在创建这篇文章之前忘了翻译
我有以下格式的字符串数据:"Ronit","abc""defgh","abcdef","fdfd",
当逗号不在字符串中时,有人可以在C++中建议一些好的代码来返回以逗号分隔的标记吗?
即它应该返回
更清楚
谢谢大家的帮助.
下面是我的示例文件,作为输入,
第一行会告诉我我有多少列#
1,名称,NAME3,NAME4
"user1","user,user2","user3","userrr
rrr4"
"用户1","用户2","用户3","我们
ER4"
"用户1", "用户2", "用户3", "USER4"
"","user2",","",#
下面是csv文件的输出,请给我编译代码,以便我可以测试,再次感谢您的帮助.
第1行,1)user1,2)user,user2 3)user3 4)userrrr4
注意rr4在下一行.
第2行,1)user1 2)user2 3)user3 4)us er4
注意er4在下一行.
第3行,1)user1 2)用户,2 3)user3 4)user4
第4行1)2)user2 3)4)
我在很大程度上取决于Python的标准库,既为有用的数据结构和操纵(例如,collections和itertools)和公用事业(如optparse,json和logging),跳过样板,只是把工作的事情.通过关于C++标准库的文档,它似乎完全与数据结构有关,而在Python的标准库中几乎没有"包含电池"的方式.
Boost库是我所知道的唯一类似于Python标准库的开源C++库集合,但是它确实有实用程序库,例如正则表达式支持,其中大部分也专用于数据结构.令我感到非常惊讶的是,即使是确保解析和编写CSV文件这样简单的事情,使用Python csv模块变得非常简单,看起来需要在C++中自己滚动(即使你利用Boost的一些解析库).
是否有其他开源库可供C++提供"电池"?如果没有,你作为一个C++程序员做什么:寻找个人实用程序库(如果是这样,如何),或者只是自己动手(这看起来很烦人和浪费)?
我想知道如何在getline功能中使用2个或更多分隔符,这是我的问题:
该程序读取一个文本文件......每一行都是如下:
New Your, Paris, 100
CityA, CityB, 200
Run Code Online (Sandbox Code Playgroud)
我正在使用getline(文件,行),但我得到整条线,当我想要获得CityA,然后是CityB,然后是数字; 如果我使用','分隔符,我不知道下一行是什么时候,所以我试图找出一些解决方案..
虽然,我怎么能用逗号和\n作为分隔符?顺便说一句,我正在操纵字符串类型,而不是char,所以strtok是不可能的:/
一些划痕:
string line;
ifstream file("text.txt");
if(file.is_open())
while(!file.eof()){
getline(file, line);
// here I need to get each string before comma and \n
}
Run Code Online (Sandbox Code Playgroud) 我试图解析一个简单的CSV文件,其格式如下:
20.5,20.5,20.5,0.794145,4.05286,0.792519,1
20.5,30.5,20.5,0.753669,3.91888,0.749897,1
20.5,40.5,20.5,0.701055,3.80348,0.695326,1
Run Code Online (Sandbox Code Playgroud)
所以,一个非常简单和固定的格式文件.我将这些数据的每一列存储到STL向量中.因此我尝试使用标准库保持C++方式,并且我在循环中的实现看起来像:
string field;
getline(file,line);
stringstream ssline(line);
getline( ssline, field, ',' );
stringstream fs1(field);
fs1 >> cent_x.at(n);
getline( ssline, field, ',' );
stringstream fs2(field);
fs2 >> cent_y.at(n);
getline( ssline, field, ',' );
stringstream fs3(field);
fs3 >> cent_z.at(n);
getline( ssline, field, ',' );
stringstream fs4(field);
fs4 >> u.at(n);
getline( ssline, field, ',' );
stringstream fs5(field);
fs5 >> v.at(n);
getline( ssline, field, ',' );
stringstream fs6(field);
fs6 >> w.at(n);
Run Code Online (Sandbox Code Playgroud)
问题是,这非常慢(每个数据文件有超过100万行),在我看来有点不优雅.有没有更快的方法使用标准库,或者我应该只使用stdio函数?在我看来,整个代码块将减少为单个fscanf调用.
提前致谢!