【问题标题】:ifstream in C++ not accepting a variableC ++中的ifstream不接受变量
【发布时间】:2012-04-15 10:05:47
【问题描述】:

我曾尝试使用以下 sn-p 代码:

int main()
{
string location_file ("test.txt");
string data;

ifstream file (location_file);
getline (file, data);
file.close();

cout << data;
return 0;
}

但这行不通。现在,如果我要使用“ifstream 文件(“test.txt”)”,它会的。为什么?到底是不是一回事?

【问题讨论】:

    标签: c++ string fstream getline


    【解决方案1】:

    因为在早期版本的 C++ 标准中,没有(令人恼火的)ifstream 的构造函数采用 string,所以你必须这样做:

    ifstream file(location_file.c_str());
    

    【讨论】:

    • 并非莫名其妙:这个想法是不同的部分大部分是相互独立的,所以你可以使用fstreams,而不是同时使用strings。采用string 的构造函数将耦合fstreamstring。这可能不是一个好的决定(我认为不是),但绝对不是莫名其妙的。
    • 另一种解释是,流的设计早在 std::string 出现之前就已经设计好了,因此没有做出决定。
    • @BoPersson:虽然确实如此,但它们同时标准化(即第一个标准化版本),并且组件肯定经过修改以更好地协同工作(例如,string 通过添加 beginendsize 等成员函数被“STLized”(后者与 length 是多余的)。添加采用 string 的构造函数将是向后兼容的更改,我记得当时在 Usenet 上多次讨论将 string 传递给 fstream 构造函数的问题,在 C++ 标准委员会成员经常光顾的小组中。
    【解决方案2】:

    问题是ifstream的构造函数不接受string作为参数,而只接受char const*。现在"test.txt" 属于char const[9] 类型,根据类型提升规则衰减为char const*,因此它可以工作。但是,没有从 stringchar const* 的隐式转换,因此您的代码不起作用。

    要修复您的代码,请使用以下命令构建您的流:

    ifstream file(location_file.c_str());
    

    【讨论】:

    • @pmr:关于您的编辑:包含初始化程序的声明定义(嗯,有一些例外,但这不是其中之一)。
    • @celtschk 好的。这是否意味着定义在引用函数/类定义和用于名称时使用不同?
    • @pmr:你没有定义名字。您可以定义类型(包括类)、函数、模板或(在本例中)对象。声明使实体的名称为人所知。定义(始终也是声明)也提供实体本身。例如,以下(在全局/命名空间范围内)声明但未定义 int 类型的对象:extern int a; 以下定义了它(没有初始化程序):int a; 以下还定义了该对象(当然不是两者都可能存在):extern int a = 3。注意:decls 也是 defs 的规则取决于作用域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多