【问题标题】:Problem reading a file containing decimals读取包含小数的文件时出现问题
【发布时间】:2011-05-01 20:14:23
【问题描述】:

我在试图弄清楚为什么我的文件返回 0 而不是文件中的数字时遇到了问题,这是我在 C++ 中读取文件时所做的代码:

    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <string>

    using namespace std;

    string cfile;
    int cnum1,cnum2,cnum3,cnum4;
    bool fired = false;



    /*
     * 
     */

    void printMatrix(double **x, int n)
    {
        int size = n;
        for(int i=0; i<size; i++)
        {
            for(int j=0; j<size; j++)
            {
                std:: cout << x[i][j] << " " ;
            }
            std:: cout << std::endl;
        }


    }

    void readFile(string file,double **x, int n)
    {
        std::ifstream myfile(file.c_str());

        int size = n;
        for(int i=0; i<size; i++)
        {
            for(int j=0; j<size; j++)
            {
                myfile >> x[i][j];
            }
        }
    }

    void GetCommandLineArguments(int argc, char **argv,string &file, int &n, int &k, int &m, int &i)
    {
        if( argc == 6 )
        {
            cfile = argv[1];
            cnum1 = atoi(argv[2]);
            cnum2 = atoi(argv[3]);
            cnum3 = atoi(argv[4]);
            cnum4 = atoi(argv[5]);
        }
        file = cfile;
        n = cnum1;
        k = cnum2;
        m = cnum3;
        i = cnum4;

    }



    int main(int argc, char** argv) {

        int k; //Factor of n
        int m; //Innner matrix size
        int i; //Iteration
        int n; //Matrix Size
        string file;


        GetCommandLineArguments(argc, argv, file, n, k, m, i);

        double **matrix;

        matrix = new double*[n];
        for(int i = 0; i<n; i++)
            matrix[i] = new double[n];

        for(int j=0; j<n; j++)
            for(int i=0; i<n;i++)
                matrix[i][j] = 0;

        readFile(file, matrix, n);
        printMatrix(matrix, n);



        return 0;
    } 

这是我的文件示例,其中包含我要从中提取的值:

20.0

20.0

20.0

20.0

20.0

200.0

20.0

200.0

希望有人可以帮助我,因为我研究了一些关于此的信息并没有真正找到解决方案。

【问题讨论】:

  • 有问题吗?没有使用它的代码,而且它可能只是工作。您的输入是否包含空行?最好不要
  • 这不是我的全部代码,我只是想在我的代码中显示我看到问题的区域。
  • 你是怎么调用这个函数的?你能展示一下使用这个函数的代码吗?
  • 是的,我刚刚编辑了我的帖子,并在我的代码中添加了一个 pastebin 链接。
  • @Novazero:您的 pastebin 链接将在 24 小时后过期 - 您认为这会有多大用处?比如说,一天?请将代码内联到您的问题中。

标签: c++ arrays 2d ifstream


【解决方案1】:

您的阅读和打印代码似乎可以正常工作,但您的命令行阅读代码可能存在一些问题。

我运行您的代码时没有获取命令行参数。以下代码几乎是从您的 main 中复制粘贴的减去获取命令行参数。

int main()
{
    double **matrix;
    std::string file = "test.dat";
    int n = 5;

    matrix = new double*[n];
    for(int i = 0; i<n; i++)
        matrix[i] = new double[n];

    for(int j=0; j<n; j++)
        for(int i=0; i<n;i++)
            matrix[i][j] = 0;

    readFile(file, matrix, n);
    printMatrix(matrix, n);

   return 0;
}

根据您提供的输入,我得到输出:

20 20 20 20 20
200 20 200 0 0
0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

但是查看您的命令行 arg 读取代码,我可以看到一些潜在的问题。首先你使用atoi()。当atoi失败时,它返回0。你知道这段代码是有效的吗?一切都正确初始化了吗?还是 atoi 在输入上失败,导致 n 为 0 并因此导致无法读取任何内容? (您可能希望查看 stringstreams 做这种事情)。

此外,当 argc 不是 6 时,您会默默地失败并从未初始化的全局内存中读取。这段记忆是垃圾。你知道这不会发生吗?如果你只是在做:

  your.exe test.dat 5

那么 5 不会从命令行读取,因为 argc 不是 6。您是否总是像在测试时那样传递 6 个参数?也许不是,因为在当前状态下,您的代码实际上只需要文件名和大小。

最重要的是,看看你是否从命令行得到了你所期望的。

PS 这是g++:

$ g++ --version g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 版权所有 (C) 2010 Free Software Foundation, Inc. 这是免费的 软件;查看复制源 条件。没有保修;不是 即使是适销性或健身 出于特定目的。

【讨论】:

  • 这是一个问题,我的数组大小将在运行时通过我在帖子中显示的 GetCommandLineArguments 命令来确定。我所有的代码都显示在我编辑的第一篇文章中。
  • 我会检查一下我创建的命令行函数我相信你的权利,它可能会改变值
  • 这里是我需要通过命令行输入的示例 p1.exe sample.input 8 4 16 100。那么 p1.exe 是否算作命令行参数?
  • @Novazero 是的,它算作一。 argv[0] 是可执行文件的名称。
  • 嗯,如果我使用命令行并且所有其他函数的 n 都包含数字 5,它肯定会将值 5 传递回去。
【解决方案2】:

我建议进行这样的修复,让事情变得更加健壮:

#include <fstream>
#include <iostream>
#include <string>
#include <stdexcept>

template <size_t size>
    void readFile(std::string file, double (&x)[size][size])
{
    std::ifstream myfile(file.c_str());

    for(int i=0; i<size; i++)
    {
        for(int j=0; j<size; j++)
        {
            if (!(myfile >> x[i][j]))
                throw std::runtime_error("Couldn't read double from " + file);
        }
    }
}

int main(int argc, const char *const args[])
{
    try
    {
        double data[10][10];
        readFile("input.txt", data);
    } catch(const std::exception& e)
    {
        std::cerr << "Whoops: " << e.what() << std::endl;
        return 255;
    }

    return 0;
}

【讨论】:

    【解决方案3】:

    您的输入运算符将读取数字,但在文件中保留换行符。

    阅读您的价值观后,请参阅有关如何ignore() 行尾的答案

    Why would we call cin.clear() and cin.ignore() after reading input?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      相关资源
      最近更新 更多