打开并读取其名称在运行时给出的文件

时间:2011-08-01 07:24:35

标签: c++

我的问题是如何正确使用函数infile.open()

我有一个课程,其中包括以下公共属性:

class myclass {
public:
int rows
int columns
const char* array_file
}

所有值都在运行时给出。

当我调用使用我所拥有的类的成员的函数时(pt是指向该类成员的指针)

#include <vector>
#include <fstream>
#include <iostream>
typedef std::vector< std::vector<int> > Matrixint;

void function(myclass* pt) { 
    Matrixint array_name(pt->rows, std::vector<int>(pt->columns));

    std::ifstream infile;

    infile.open("%s", pt->array_file); // my problem: is this correct?
    for (int a = 0; a < pt->rows; a++) {
         for (int b = 0; b < pt->columns; b++) {
               infile >> array_name[a][b] ;
         }
    }
    infile.close();

}

这种打开/读取文件的方式是否正确?

文件中的数据格式为this question(请注意:文件中只有数组,没有其他数据)

2 个答案:

答案 0 :(得分:3)

infile.open将第一个参数作为文件名:

void open ( const char * filename, ios_base::openmode mode = ios_base::in );

source

我不知道你的文件名是什么,但也许是这样的(只是基于变量类型的猜测)可以做到:

infile.open(pt->array_file); 

当然,您必须确保在调用该函数时传入的文件名是正确的。

答案 1 :(得分:2)

假设我修复你的问题代码的心理能力是正确的,我会这样写:

struct mine {
    int rows
    int columns
    std::string array_file
}

void function(const mine& m) { 
    Matrixint array_name(pt->rows, std::vector<int>(pt->columns));

    std::ifstream infile(m.array_file.c_str());

    for (int a = 0; a < ls->rows && infile.good(); ++a) {
         for (int b = 0; b < ls->columns && infile.good(); ++b) {
               infile >> array_name[a][b] ;
         }
    }

    if(!infile) 
        throw "Uh oh!"; // assume real error handling here
}

为什么我改变了所有这些东西?

  • 包含所有公共数据的类不是class,而是数据聚合。我会使用struct,以免混淆后来需要维护我的代码的人。 (这可能包括我在未来几年,这是一个非常有帮助的强烈动机。)
  • 除非你确切知道自己在做什么(似乎并非如此),否则你应该使用std::string而不是C风格的字符串。
  • Why pass the function parameter by pointer, when you can use a const reference
  • std::ifstream有一个构造函数,您可以使用它立即打开文件。我很少使用(或看到使用过)open()成员函数。
  • 您需要测试文件是否已打开以及输入操作是否成功。 (在这种情况下,我合并了测试是否可以通过输入操作成功测试打开,因为for循环是一个预测试循环。)在操作之后,我检查是否发生了错误。或者,当读取失败时,您可以跳出循环,但会出现异常。
  • 通常不需要关闭流,因为它的析构函数已经这样做了。如果你使变量尽可能是本地的(这是一个很好的编程实践),文件将立即关闭。