(C ++)有人可以帮我从字符串中获取getline吗?

时间:2016-04-27 19:54:28

标签: c++

我是这个社区的新手。

我有一个程序从.txt文件中获取信息,然后将其存储到一个数组中供将来使用。但是,当我尝试从带有城市名称的文件中获取行时,它的效果不佳。

该行的Sameple:

8175133 New York, New York, United States
7871900 Taipei, Taiwan
7785965 Kinshasa, Democratic Republic of the Congo

这里的重点是获取权重(即那些long int)和城市名称(包括国家名称.etc)然后将它们存储到名为“Term”的类中,该类具有两个变量“weight”和“查询”。然后将“Term”类存储在列表中。

我的问题是,我怎么能这样做?(从文件中获取信息) 我这样做的方法是获得整线(如“7871900台北,台湾”)然后尝试使用“(getline(iss,get_line,'')”但它没有用,给我“0”为大多数的。

  Autocomplete Search_SL(10),Result_SL(k+1);
    while (!in_file.eof())
    {
        string weight;
        string query_LS;
        long weight_LS;
        string name;
        getline(in_file,name);
        istringstream iss(name);
        for (int i = 0;i < 10;i++)
        {
            if (getline(iss,get_line,' '))
            {
                weight = get_line;
                if (i == 1)
                {
                    weight_LS = atoi(weight.c_str());
                    cout<< weight_LS<<endl;
                }
                else
                {
                    query_LS += weight;
                }
            }
        }
        if (query_LS != "")
        {    
            Term input_que(query_LS,weight_LS);
            Search_SL.insert(input_que);
            last++;
        }    
    }    

如果您对我的问题有任何疑问,请告诉我们! :P谢谢!

PS:这是一个示例输出(正确的):

Please input the search query(type "exit" to quit): 
Chic↵↵ 

 1. 2695598 Chicago, Illinois, United States 
 2. 577375 Chiclayo, Peru
 3. 86187 Chico, California, United States 

我确定我的其余程序是正确的当我使用其他txt文件时,其行如“

 1. 5627187200  the 
 2. 509184100   at

它会起作用

4 个答案:

答案 0 :(得分:1)

您可以使用operator>>的提取stringstream(使用空格作为输入分隔符)来读取weight的格式化long int值(无需将其读作然后你可以使用getline来读取stringstream中剩余的一行。

string query_LS;
long weight_LS;
string name;
while (in_file.peek() != EOF)
{
    getline(in_file,name);//read a line from the file
    istringstream iss(name);

    query_LS="";
    iss>>weight_LS;//read a formatted long integer,reads upto the space
    getline(iss,query_LS);//read the rest of the string     

    if (query_LS != "")
    {    
        Term input_que(query_LS,weight_LS);
        Search_SL.insert(input_que);
        last++;
    } 
}   

答案 1 :(得分:0)

以下是潜在解决方案的概要,未经测试,因此可能需要进行一些调整。

std::string buffer = "";
while(getline(in_file, buffer)) {
    // parse up to the first space (by checking characters in buffer)
    size_t count1 = 0;
    while (buffer.at(count1) != ' ' && count1 < buffer.size()) {
        ++count1;
    }
    // get substring of buffer up to first space occurrence, and convert to 
    // integral type to store in long variable
    long weight = atoi(buffer.substr(0,count1).c_str());

    // do similar parsing around the commas to get the city/country data...

}

答案 2 :(得分:0)

也许您的代码存在一个直接问题?

if (i == 1)    ==>   if (i == 0)  

但我喜欢重用std::中的内容,特别是在简单的情况下。

这是我的#34;我也是......&#34; (另):

struct Term {std::string query; long weight;};
... 
Term input{};
while(in_file>>input.weight && std::getline(in_file, input.query))
    if (!input.query.empty())
        Search_SL.insert(input);

答案 3 :(得分:-1)

获得该行后,尝试迭代istringstream元素(取自here的示例):

istringstream iss("2.832 1.3067 nana 1.678");
double num = 0;
while(iss >> num || !iss.eof()) {
    if(iss.fail()) {
        iss.clear();
        string dummy;
        iss >> dummy;
        continue;
    }
    cout << num << endl;
}

这只会返回字符串流中的数字。

编辑:反过来执行此操作的代码,即获取字符串而不是数字:

#include <sstream>
#include <iostream>

using namespace std;

int main(){

    istringstream iss("2.832 mike 1.3067 nana 1.678");
    double num = 0;
    while(iss >> num  || !iss.eof()) {
        if(iss.fail()) {
            iss.clear();
            string dummy;
            iss >> dummy;
            cout << dummy << endl;
            continue;
        }
    }
}