我是这个社区的新手。
我有一个程序从.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
它会起作用
答案 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;
}
}
}