【问题标题】:User-input file path用户输入文件路径
【发布时间】:2015-02-19 13:39:31
【问题描述】:

程序应该打开一个路径是用户输入的文本文件。接下来,它计算文件中包含的行并输出它们。这是我尝试过的:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
string path = NULL;
string garbage = NULL;
int cnt = 0;
cout << "Enter file path: ";
cin >> path;

ifstream inFile(path.c_str());
if (inFile)
{
    while (!inFile.eof())
    {
        getline(inFile, garbage);
        ++cnt;
    }
}
inFile.close();

cout << endl;

cout << path << " has " << cnt << " lines";


cin.ignore();
cin.get();
return 0;
}

这是我得到的:

程序:C:\Windows\SYSTEM32\MSVCP120D.dll 文件:c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstring 线路:1168 表达式:无效的空指针

注意:我所学习的课程仅向我展示了 ifstream 和 ofstream 使用的方法的基础知识,例如 open、close 和 eof。所以我会很感激只有这些的解决方案,因为我相信你知道很多方法。

【问题讨论】:

  • 您的代码有另一个(常见)错误:当您尝试读取某些内容但由于您处于文件末尾而无法读取时,会发生文件末尾检测。但是您在读取该行之前检查文件结尾,而不是在读取该行之后,因此您会得到错误的答案。
  • 你应该使用while (getline(inFile, garbage))
  • 好的,现在我明白赫尔基在告诉我什么了。谢谢尼尔。
  • 哦,最后一条评论:你应该用一个最后一个字符是换行符的输入文件和另一个最后一个字符不是换行符的输入文件来测试你的程序。 (你还必须决定在这两种情况下正确的答案应该是什么)

标签: c++ string file-io


【解决方案1】:

std::string 类是一个合理的容器类,类似于 std::vector,但其 API 具有许多额外的面向字符串的函数。

特别是,它的使用char* 方面类似于老式的C 样式字符串处理,我假设您在这方面有尝试使用NULL 的想法作为初始化器。 (在现代 C++ 中,您应该使用 C++ 关键字 nullptr 创建空指针,而不是旧的 C 风格宏 NULL

string path = NULL; 实际上 所做的是将NULL 解释为const char*,然后尝试读取NULL 指向的位置处的C 样式字符串以便复制它进入path。由于 NULL 为 null 而不是实际指向字符串,因此您会收到您引用的错误消息。

您真正想要做的是简单地通过string path; 使用默认构造函数,它将path 初始化为一个空字符串。

【讨论】:

  • 不敢相信就这么简单。但是,我仍然不明白您对 eof 错误的意思。它输出正确。
【解决方案2】:

不要使用无意义的NULL,它们不是指针:

string path;
string garbage;

【讨论】:

  • 我认为初始化你声明的每个变量是一个好习惯。
  • @hornet: Paul 的代码 does 初始化器pathgarbagestd::string 类的默认初始化程序会创建一个空字符串。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 2012-03-30
  • 2012-03-14
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多