为什么当 ifstream 使用从键盘读取的字符串创建文件时出现错误?
Why do I get error when ifstream is creating file with string read from keyboard?
我正在做 Bjarne Stroustrup 的书 Programming Principles and Practice Using C++ 中的练习。我正在进行 第 10 章 的第一个练习,它说要编写一个程序,生成一个由空格分隔的整数文件中所有数字的总和。我的下面代码基于第 10.5 章 练习 2 中使用的代码。创建 ifstream
对象时出现错误。这是我正在尝试的代码 运行:
#include "../../std_lib_facilities.h"
int main(int argc, const char * argv[]) {
// insert code here...
cout << "Plese enter the input file name: " << endl;
string iname;
cin >> iname;
ifstream ist {iname};
if (!ist) error("Can't open input file ",iname);
vector<int> numbers;
int sum;
int n;
while(ist>>n) {
numbers.push_back(n);
}
for (int i=0; i<numbers.size(); ++i) {
sum += numbers[i];
}
cout << sum << endl;
return 0;
}
我输入的任何内容都出现错误。我尝试了 myin、myin.txt 或任何其他名称。 error("Can't open input file ",iname);
来自作者创建的库。
我知道该文件确实存在于与 main.cpp 相同的目录中,并且使用纯文本格式使用 Mac 中的 TextEdit 创建。
传递参数肯定有一些混乱。您应该尝试传递输入文件的绝对路径。
以下是您修改后的申请。这将创建一个测试文件并使用它而不是为案例 1 询问文件名。对于案例 2,它使用不存在的文件。(如果存在则删除)
#include <cstdio>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
template <typename T> void error(const T &t) { cout << t; }
template <typename T, typename... Args> void error(const T &t, Args... args) {
cout << t << " ";
error(args...);
cout << "\n";
}
int main(int argc, const char *argv[]) {
// insert code here...
// cout << "Plese enter the input file name: " << endl;
string iname = "a.txt";
ofstream ofs{iname};
ofs << 1 << " " << 2 << " " << 3 << " " << 4;
ofs.close();
// cin >> iname;
// part 1
{
cout << "Case1: Reading file a.txt which is just created\n";
ifstream ist{iname};
if (!ist)
error("Can't open input file ", iname);
if (ist.is_open()) {
vector<int> numbers;
int sum = 0;
int n = 0;
while (ist >> n) {
numbers.push_back(n);
}
for (int i = 0; i < numbers.size(); ++i) {
sum += numbers[i];
}
cout << sum << endl;
ist.close();
} else {
error("can't open file to read", iname);
}
}
// part 2
{
cout << "Case2:reading file which is not present\n";
iname = "b.txt";
std::remove(iname.c_str()); // delete if present
ifstream ist{iname};
if (!ist)
error("Can't open input file ", iname);
if (ist.is_open()) {
vector<int> numbers;
int sum = 0;
int n = 0;
while (ist >> n) {
numbers.push_back(n);
}
for (int i = 0; i < numbers.size(); ++i) {
sum += numbers[i];
}
cout << sum << endl;
ist.close();
} else {
error("can't open file to read", iname);
}
}
return 0;
}
注意:std::ifstream
的构造总是创建对象。您需要像以前一样或 is_open()
方法访问它的对象。
[...] in the same directory with main.cpp [...]
输入文件相对于源文件的位置并不重要。
当您 运行 程序时,该文件应该位于环境的当前工作目录中。
我正在做 Bjarne Stroustrup 的书 Programming Principles and Practice Using C++ 中的练习。我正在进行 第 10 章 的第一个练习,它说要编写一个程序,生成一个由空格分隔的整数文件中所有数字的总和。我的下面代码基于第 10.5 章 练习 2 中使用的代码。创建 ifstream
对象时出现错误。这是我正在尝试的代码 运行:
#include "../../std_lib_facilities.h"
int main(int argc, const char * argv[]) {
// insert code here...
cout << "Plese enter the input file name: " << endl;
string iname;
cin >> iname;
ifstream ist {iname};
if (!ist) error("Can't open input file ",iname);
vector<int> numbers;
int sum;
int n;
while(ist>>n) {
numbers.push_back(n);
}
for (int i=0; i<numbers.size(); ++i) {
sum += numbers[i];
}
cout << sum << endl;
return 0;
}
我输入的任何内容都出现错误。我尝试了 myin、myin.txt 或任何其他名称。 error("Can't open input file ",iname);
来自作者创建的库。
我知道该文件确实存在于与 main.cpp 相同的目录中,并且使用纯文本格式使用 Mac 中的 TextEdit 创建。
传递参数肯定有一些混乱。您应该尝试传递输入文件的绝对路径。
以下是您修改后的申请。这将创建一个测试文件并使用它而不是为案例 1 询问文件名。对于案例 2,它使用不存在的文件。(如果存在则删除)
#include <cstdio>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
template <typename T> void error(const T &t) { cout << t; }
template <typename T, typename... Args> void error(const T &t, Args... args) {
cout << t << " ";
error(args...);
cout << "\n";
}
int main(int argc, const char *argv[]) {
// insert code here...
// cout << "Plese enter the input file name: " << endl;
string iname = "a.txt";
ofstream ofs{iname};
ofs << 1 << " " << 2 << " " << 3 << " " << 4;
ofs.close();
// cin >> iname;
// part 1
{
cout << "Case1: Reading file a.txt which is just created\n";
ifstream ist{iname};
if (!ist)
error("Can't open input file ", iname);
if (ist.is_open()) {
vector<int> numbers;
int sum = 0;
int n = 0;
while (ist >> n) {
numbers.push_back(n);
}
for (int i = 0; i < numbers.size(); ++i) {
sum += numbers[i];
}
cout << sum << endl;
ist.close();
} else {
error("can't open file to read", iname);
}
}
// part 2
{
cout << "Case2:reading file which is not present\n";
iname = "b.txt";
std::remove(iname.c_str()); // delete if present
ifstream ist{iname};
if (!ist)
error("Can't open input file ", iname);
if (ist.is_open()) {
vector<int> numbers;
int sum = 0;
int n = 0;
while (ist >> n) {
numbers.push_back(n);
}
for (int i = 0; i < numbers.size(); ++i) {
sum += numbers[i];
}
cout << sum << endl;
ist.close();
} else {
error("can't open file to read", iname);
}
}
return 0;
}
注意:std::ifstream
的构造总是创建对象。您需要像以前一样或 is_open()
方法访问它的对象。
[...] in the same directory with main.cpp [...]
输入文件相对于源文件的位置并不重要。 当您 运行 程序时,该文件应该位于环境的当前工作目录中。