C :为什么矢量实现不产生逗号限制的值
C++: why is vector implementation not yielding comma-delimited values?
我有一个带有逗号分隔的值的database.txt
文件:
Name,ID,Year,Gender
我想提取每个元素。
我已经从此代码开始(我已经查看了所有其他类似的问题并实施了他们建议的内容(,但是它并没有打印每个作品:
// reading a text file
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int main () {
string line;
ifstream myfile ("database.txt");
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
std::string str = line;
std::vector<int> vect;
std::stringstream ss(str);
int i;
while (ss >> i)
{
vect.push_back(i);
if (ss.peek() == ',')
ss.ignore();
}
for (i=0; i< vect.size(); i++)
std::cout << vect.at(i)<<std::endl;
//cout << line << 'n';
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
如何将其修改以提取每个值:名称,ID,年和性别?我在做什么错?
使用此功能将每一行分开:
vector<string> split(const string &s, char delim) {
stringstream ss(s);
string item;
vector<string> tokens;
while (getline(ss, item, delim)) {
tokens.push_back(item);
}
return tokens;
}
您的代码就像:
// reading a text file
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int main () {
string line;
ifstream myfile ("database.txt");
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
std::string str = line;
std::vector<string> vect;
vect = split(str, ',') ;
for (int i=0; i< vect.size(); i++)
std::cout << vect.at(i)<<std::endl;
//cout << line << 'n';
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
在实用程序功能和数据结构的帮助下,您可以很容易地简化它。
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
std::vector<std::string> splitString( const std::string& stringToSplit, const std::string& delimiter, const bool keepEmpty ) {
std::vector<std::string> results;
if ( delimiter.empty() {
results.push_back( stringToSplit );
return results;
}
std::string::const_iterator itSubStrStart = stringToSplit.begin(), itSubStrEnd;
while( true ) {
itSubStrEnd = std::search( itSubStrStart, stringToSplit.end(), delimiter.begin(), delimiter.end() );
std::string temp( itSubStrStart, itSubStrEnd );
if ( keepEmpty || !temp.empty() )
results.push_back( temp );
if ( itSubStrEnd == stringToSplit.end() )
break;
itSubStrStart = itSubStrEnd + delimiter.size();
}
return results;
}
struct DataEntry {
std::string name;
unsigned id;
unsigned year;
std::string gender;
};
int main() {
std::string line;
std::fstream file;
file.open( "database.txt" );
std::vector<DataEntry> entries;
std::vector<std::string> elements;
while( file >> line ) {
elements = splitString( line, "," );
DataEntry entry;
entry.name = elements[0];
entry.id = std::stoul( elements[1] );
entry.year = std::stoul( elements[2] );
entry.gender = elements[3];
entries.push_back( entry );
}
file.close();
for ( auto& e : entries ) {
std::cout << e.name << " " << e.id << " "
<< e.year << " " << e.gender << 'n';
}
std::cout << "nPress any key and enter to quit.n";
std::cin.get();
return 0;
}
database.txt
John,12345,2010,M
Jane,54321,2012,F
output
John 12345 2010 M
Jane 54321 2012 F
这只要首先阅读一行就可以使生活变得容易得多。然后解析该线条,然后从那里进行该数据做的事情;将其存储到结构上,打印,操作等等。
Edit
您需要意识到以下事实:在文本行中阅读时,如果您在文本文件中有类似的内容:
John Doe,12345,2010,M
它不会给您期望的东西。我会留下来供你弄清楚。
相关文章:
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 为什么在此排序算法实现中,向量明显比数组慢?
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- 为什么读取函数在 sha1 c++ 实现中不起作用?
- 为什么在PIMPL中无法访问实现类的常量函数?
- 为什么目录中的 std::filesystem::file_size 留给实现?
- 为什么这个快速排序实现给出了一个奇怪的输出
- 为什么 MSVC _count_of实现将 0 添加到 sizeof 的结果中?
- 为什么sub_match和basic_string比较运算符使用额外的字符串副本实现?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 为什么在我的实现中,所有数组都对齐到 16 个字节?
- 为什么地图需要实现'operator<'以及如何比较对象?
- 为什么这个Pascal三角实现给了我尾随的零
- 为什么其中一个斐波那契序列的动态编程实现比另一个更快
- C++头和实现,(为什么)它不是由IDE/编译器自动处理的