C :为什么矢量实现不产生逗号限制的值

C++: why is vector implementation not yielding comma-delimited values?

本文关键字:为什么 实现      更新时间:2023-10-16

我有一个带有逗号分隔的值的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

它不会给您期望的东西。我会留下来供你弄清楚。