【问题标题】:Split fields tab by tab using C++使用 C++ 按选项卡拆分字段
【发布时间】:2014-04-23 08:31:30
【问题描述】:

给定一个文本文件,就像 (file.txt):

1234567A(这是标签)彼得,ABC(这是标签)23523456
1345678A (这是标签) Michael CDE (这是标签) 23246756
1299283A(这是标签)安迪(这是标签)98458388

ifstream inFile;
string s;
string id;
string name;
int phoneNo;
inFile.open("file.txt");
while (!inFile.eof()) {
   getline(inFile, s, '\t');
}

如何将一行的字符串提取到不同的字段中?例如,当我打印s 时,它会给出1234567A。我尝试了 Stackoverflow 中的一些技术,但是我无法实现目标。

谢谢。


我还想问的是第三个字段(即phoneNo)是否由1-3个元素组成,

1234567A (这个是标签) Peter, ABC (这个是标签) 23523456 (这个是标签) 12312312
1345678A (这是标签) Michael CDE (这是标签) 23246756
1299283A (这个是标签) 安迪 (这个是标签) 98458388 (这个是标签) 123123123 (这个是标签) 123123123

如何区分phoneNo的号码?

【问题讨论】:

    标签: c++ string ifstream getline


    【解决方案1】:
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    
    
    //...
    
    std::ifstream inFile( "file.txt" );
    
    std::string record;
    
    while ( std::getline( inFile, record ) )
    { 
       std::istringstream is( record );
    
       std::string id;
       std::string name;
       int phoneNo = 0;
    
       is >> id >> name >> phoneNo; 
    }
    

    或

    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    
    
    //...
    
    std::ifstream inFile( "file.txt" );
    
    std::string record;
    
    while ( std::getline( inFile, record ) )
    {
       if ( record.find_first_not_of( " \t" ) == std::string::npos ) continue;
    
       std::istringstream is( record );
    
       std::string id;
       std::string name;
       int phoneNo = 0;
    
       is >> id >> name >> phoneNo; 
    }
    

    如果例如字段名称由多个单词组成,而不是operator &gt;&gt;,则应再次使用函数std::getline 例如

    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    
    
    //...
    
    std::ifstream inFile( "file.txt" );
    
    std::string record;
    
    while ( std::getline( inFile, record ) )
    {
       if ( record.find_first_not_of( " \t" ) == std::string::npos ) continue;
    
       std::istringstream is( record );
    
       std::string id;
       std::string name;
       int phoneNo = 0;
    
       std::getline( is, id, '\t' );
       std::getline( is, name, '\t' );
       is >> phoneNo; 
    }
    

    如果手机的数量是可变的,您应该使用std::vector&lt;unsigned int&gt; 或std::vector&lt;std::string&gt; 并更改我展示的函数的最后一条语句

       while ( is >> phoneNo ) v.push_back( phoneNo );
    

    其中 v 可以定义为例如std::vector&lt;unsigned int&gt;

    【讨论】:

    • 如果名称的内容是“Peter ABC”,则无法找到正确的名称...如何解决?
    • 参照加粗的问题,请问如何解决?我使用if phoneNo2==" ").... 对其进行了测试,但它不起作用
    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多