如何在C++中从文本中获取双精度数

4

我有一个文本文件,看起来像这样:

user_name1 1.575
user_name2 3.636
user_name3 2.647
user_name4 5.532
user_name5 4.253

我正在尝试的是从.txt文件中将这些数字获取到控制台并保存为变量。我知道如何在控制台中读取.txt文件,并在此处找到了一些答案,以便单独获取每行作为字符串,但我无法获取这些双精度数。是否有某种功能或其他方法可以遍历字符串并查找数字?
我尝试过以下方法:
1)获取每行的字符串 2)循环遍历它们,检查ASCII代码,如果是数字,则保存下一个3或4个字符
但效果不太好。非常感谢您的帮助。 编辑:
string line;

ifstream banka ("banka.txt");

double numbers[5];
if(banka.is_open()) {
    for(int i=0; i<5; i++) {
        getline(cin,line);
        size_t space=line.find(' ');
        string numStr=line.substr(space+1);
        double num = stod(numStr);
        numbers[i]=num;

    }
    banka.close();
}
else {
    cout<<"Unable to open file."<<endl;
}

如果您有支持的编译器,您可以使用std::regex - jaredready
1
请展示出“运行不良”的代码,否则我们无法确定你的问题所在。 - ApproachingDarknessFish
4
std::stod 是C++标准库中的一个函数,用于将字符串转换为双精度浮点数类型。它接受一个字符串参数并返回相应的双精度浮点数值。 - Some programmer dude
越来越糟糕的建议...正则表达式、scanf()...不行!换成getline()、std::string::find()以及std::stod()。 - user529758
@ResidentBiscuit 我正在使用Xcode。 - spafrou
显示剩余4条评论
4个回答

6

为什么不直接这样做呢?

std::ifstream fin("input.txt");
std::string str;
double num;

while (fin >> str >> num)
{

    std::cout << str << " :" << num <<std::endl;
}

因为它不可靠。 - user529758
@H2CO3 我不会和这些人争论,但为什么它不可靠?我认为只要它们被空格分隔开来,它就是可靠的。 - P0W
由于operator>>受制于iomanip流操作符和其他“有趣”的东西,因此您永远无法确定它是否执行所宣传的功能。基本上,这个操作符与scanf()具有相同的问题:它试图同时完成两件事情(获取用户输入和解析它),并且毫不奇怪地没有正确地执行其工作,就像它的C语言对应部分一样。 - user529758
@H2CO3 scanf() 怎么会失败呢?我知道它不是类型安全的,但这并不是这种情况下的问题。 - David G
@P0W: 哎呀,我没上榜。 :) - John Dibling
@0x499602D2 这很混乱,它的使用方式不直观,而且容易出现未定义行为(尽管最后一个断言不适用于 operator>>)。 - user529758

1
这个:
std::string ln; // line
while (std::getline(std::cin, ln)) {
    std::size_t space = ln.find(' ');
    std::string nameStr = ln.substr(0, space);
    std::string numStr = ln.substr(space + 1);
    double num = std::stod(numStr);
}

1
我尝试了这段代码并使用cout在控制台中检查,但它不起作用,虽然我认为我做错了什么。还有一件事:我总是有5行,这意味着5个双精度数字。我可以简单地使用for循环而不是while,并将这些双精度数保存到数组中吗?谢谢您的帮助。 - spafrou
@spafrou 它正在工作。是的,你可以使用for循环。注意:不要使用当前排名最高(尽管不太好)的答案,它是危险的。 - user529758
1
你能帮我查看一下我编辑过的代码吗?它给了我一个错误:libc++abi.dylib: terminating with uncaught exception of type std::invalid_argument: stod: no conversion。 - spafrou
@spafrou,你传递给它的是一个不代表数字的字符串。由于你没有展示文件的格式,我不知道发生了什么。 - user529758
我有一个名为"banka.txt"的文件,其内容与我在问题中描述的完全一致。我仅修改了名称。 - spafrou
显示剩余2条评论

0

如果您知道该行包含一个空格且仅有一个空格:

string dstr = line.substr(line.find(' ')+1);
double d = strtod(dstr.c_str(), NULL);

我有一个数字:1.34,但这给了我0。 - spafrou

0
你可以使用std::istringstream来解析一个字符串:
std::istringstream iss("user_name1 1.575");
std::string str;
double d;
iss >> str >> d;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接