如何从文件中读取数字并将其用作C++中的变量?

How to read a number from a file and use it as a variable in C++?

提问人: 提问时间:5/25/2021 最后编辑:Obsidian 更新时间:5/25/2021 访问量:162

问:

假设我正在阅读一个文件,内容如下:

#character         posX      posY //commentary line: explains what it represents
CharacterName1     50.0       0.0

CharacterName2     32.0       50.0

这里的目标是能够读取 posX et posY 并在我的 C++ 程序中将它们转换为 2 个双精度变量 x 和 y。

现在,我所能做的就是开始阅读文件,看看该行是否对应于空行或注释行。 然后,如果阅读行找到相应的字符名,我应该能够继续阅读这一行以获得 posX 和 posY,但我不知道该怎么做。我不知道如何跳过空白,如何开始读取数字以及如何完成读取然后将其转换为双倍。

关于我应该怎么做的任何想法?

我真的希望这已经足够清楚了。

先谢谢你。

尝试示例

void loadMap(std::string const& filepath) {


    std::ifstream infile(filepath.c_str());
    
    if(infile.fail()) {  
        
        std::cerr << "Error... " << std::endl;
        
    } else { /opening occured correctly
       
        while ( !infile.eof() ) {
            
            std::string line; 
            std::getline(infile, line);
            
            if ( (line[0] != '#') or (line.empty()) ) { //if line not comment or not empty
                  
                
                if( line.find("CharacterName1") ) {.......

然后我迷路了。

C++ Fstream IOstream(英语:IOSTREAM)

评论

2赞 Anton 5/25/2021
这回答了你的问题吗?从 C++ 中的文本文件中读取数值数据
0赞 5/25/2021
我在发布之前看到了这个问题,但我不太明白提出的答案。
0赞 Kitswas 5/25/2021
你能向我们展示你的尝试吗?
0赞 5/25/2021
@PalLaden,我用一个例子编辑了我的问题,我希望它能把事情弄清楚
1赞 Konrad Rudolph 5/25/2021
请仔细阅读:为什么 iostream::eof 在循环条件中(即 while (!stream.eof()))被认为是错误的?

答:

3赞 dixit_chandra 5/25/2021 #1

希望这段代码会有所帮助。

#include <bits/stdc++.h>
using namespace  std;         //change headers and namespaces; included for ease of use;

vector<string> split(const string &text, const char sep) {
    vector<string> tokens;
    std::size_t start = 0, end = 0;
    while ((end = text.find(sep, start)) not_eq string::npos) {
        tokens.emplace_back(text.substr(start, end - start));
        start = end + 1;
    }
    tokens.emplace_back(text.substr(start));
    return tokens;
}

    int main()
    {
       ofstream outdata;
       outdata.open("example.txt");
       if( not outdata ) {
          cerr << "Error: file could not be opened" << endl;
          exit(1);
       }
       outdata<<"CharacterName1"<<','<<10.0<<','<<40.0<<endl; //writing data into file
       outdata<<"CharacterName2"<<','<<20.0<<','<<30.0<<endl;
       outdata<<"CharacterName3"<<','<<30.0<<','<<20.0<<endl;
       outdata<<"CharacterName4"<<','<<40.0<<','<<10.0<<endl;
       outdata.close();

        ifstream inputFile;
        inputFile.open("example.txt",fstream::in);
        if (inputFile.fail())
        {
            cerr<<"Error: file could not be opened"<<endl;
            exit(1);
        }
        string line;
        vector<string> col1;
        vector<double> col2;
        vector<double> col3;
        while (getline(inputFile, line))
        {
            if(not line.empty()){

            auto lineData = split(line, ','); //separator can change in your case
            col1.emplace_back(lineData[0]);
            col2.emplace_back(std::stof(lineData[1]));
            col3.emplace_back(std::stof(lineData[2]));
            }
        }
        for(int i =0; i<(int) col1.size();i++)         //printing the data;
            cout<<col1[i]<<"\t"<<col2[i]<<"\t"<<col3[i]<<"\n";
       return 0;
    }

通过以下方法理解上述逻辑:

  1. 读取文件的每一行。

  2. 对于每一行,我们将通过函数分离列数据,该函数将返回该行的包含数据。这是文件中使用的分隔符;当我使输入文件以逗号分隔时,我使用了split(string, sep)vector<string>sep','

  3. 将返回的类型 row-data 转换为适当的数据类型并存储在相应的列向量中。vector<string>col1, col2, col3

  4. split() 功能的引用。

对于可能缺少某些数据的另一列 您可以添加一些逻辑,例如

if(lineData.size() > 3)
    col4.emplace_back(std::stof(lineData[3]));
else
    col4.emplace_back(0.0);

在行之后。col3.emplace_back(std::stof(lineData[2]));

评论

3赞 Bathsheba 5/25/2021
你可能花了一段时间才写出来。为什么不用充分的解释来完成答案呢?我还会删除前两行 - 您不会经常在生产代码中看到它们。
0赞 Konrad Rudolph 5/25/2021
我从未见过有人毫无讽刺意味地使用.你真的认为这比?not_eq!=
0赞 dixit_chandra 5/25/2021
@Bathsheba 我正在等待帖子所有者的确认,以确定它是否是所需的解决方案,以便我可以帮助提供更好的解释。
1赞 dixit_chandra 5/25/2021
@Bathsheba一定要帮我 😜
1赞 Bathsheba 5/25/2021
@dixit_chandra:谢谢。反对票转换为赞成票!