字符串和输入文件,从包含字符串的 txt 文件中分配几个变量值

Posted

技术标签:

【中文标题】字符串和输入文件,从包含字符串的 txt 文件中分配几个变量值【英文标题】:Strings and input files, Assign several variables values from txt file that contains strings 【发布时间】:2017-06-08 20:49:42 【问题描述】:

我是 C++ 编程新手,我不确定输入和输出流的工作原理。我想取一个txt文件,其中包含由分隔符(':')分隔的字符串和字符,以分配类成员变量。

到目前为止,我已经能够拥有一个每行包含一个双精度或整数的 txt 文件,并将它们分配给变量。目前我所拥有的:

当前的“Default.txt”

10

3

0.80

1.5

我目前用于变量赋值的代码:

#include <iostream>
#include <fstream>

RandomObject::RandomObject() //The Default Constructor

std::ifstream my_file;

my_file.open("Default.txt");

//Not sure if this the most effective way to do this...
    if (my_file.is_open())
    
        while (~my_file.eof())
           my_file >> Var1;   //Var1 is now an int with value 10
            my_file >> Var2;   //Var2 is now an int with value 3
            my_file >> Var3;   //Var3 is now double with value 0.80
            my_file >> Var4;   //Var4 is now double with value 1.5
            break;
        
    
    
    my_file.close();

现在我希望 txt 文件是:

新的“Default.txt”

每个维度的数量:10

维数:3

数字密度:0.80

初始温度:1.5

我想把冒号后面的值赋给一个成员变量:

int Var1 = 10;
int Var2 = 3;
double Var3 = 0.80;
double Var4 = 1.5;

以及一些指示变量初始化的输出文本:

“变量 1 设置为 10”

“每维数为 10”。

我该怎么做呢? txt 文件将以相同的顺序包含所有值,但如果可能的话,让程序读取“每维数”作为第一个字符串以自动将 10 分配给 Var1 可能会很有用。

我猜第一步是以某种方式将它分成两个字符串,以':'作为分隔符并将其存储在一些临时字符串数组变量中?我不确定读取行并将值存储在上面的代码中到底发生了什么。

我想了解文件流的实际工作原理。抱歉,格式不好。

【问题讨论】:

***.com/questions/5605125/… 使用while (!my_file.eof()) 而不是~,这是一种二进制反转,而不是逻辑反转。 不要在while循环中使用my_file.eof() 【参考方案1】:

我不会给你写一些代码,因为你上面有一个,所以我将向你解释我将如何做/以及它们是如何工作的,并为你提供一些有用的链接。

使用std::getline(file_name,line) 读取一行。 getline() 有一个默认分隔符 \n。所以它将整行存储在变量line中。

getline() 返回的内容存储在字符串变量中,使用std::find 查找":" 及其位置。它将返回size_t position,将其与substr 和/或erase 函数一起使用将这两个部分放在不同的变量中。

字符串变量string var_text 与您的文本将保持原样,但您希望它为intdouble 的值需要修改。您必须首先将string var_text 与您想要的任何字符串进行比较。根据结果​​,您可以使用stringstream 将变量设置为intdouble

现在您已经有了所需形式的变量,您可以将它存储在适当的类成员中。

只要getline() 返回 1,就重复此操作。

【讨论】:

【参考方案2】:

试试类似的方法:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

RandomObject::RandomObject() //The Default Constructor

    std::ifstream my_file("Default.txt");
    std::string line;

    while (std::getline(my_file, line))
    
        std::istringstream iss(line);
        std::string name;

        std::getline(iss, name, ':');

        if (name == "Number Per Dimension") 
            iss >> Var1;   //Var1 is now an int with value 10
            std::cout << name << " is " << Var1 << std::endl;
        

        else if (name == "Number of Dimensions") 
            iss >> Var2;   //Var2 is now an int with value 3
            std::cout << name << " is " << Var2 << std::endl;
        

        else if (name == "Number Density") 
            iss >> Var3;   //Var3 is now double with value 0.80
            std::cout << name << " is " << Var3 << std::endl;
        

        else if (name == "Initial Temperature") 
            iss >> Var4;   //Var4 is now double with value 1.5
            std::cout << name << " is " << Var4 << std::endl;
        
    

【讨论】:

以上是关于字符串和输入文件,从包含字符串的 txt 文件中分配几个变量值的主要内容,如果未能解决你的问题,请参考以下文章

从postgres中的路径中分割出文件名

c++文件怎么从文件中读出和写入字符串?

从文件读数据插入到链表

如何修改此代码以处理包含字符和整数的输入文本?

使用 pandas 从 txt 加载数据

比较2个文件中的子字符串