#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main (int argc, char* argv[])
{
string STRING;
ifstream infile;
STRING = argv[1];
infile.open(argv[1]);
if (infile.fail())// covers a miss spelling of a fail name
{
cout << "ERROR. Did you make a mistake in the Spelling of the File\n";
return 1;
}
else
{
while(!infile.eof())
{
getline(infile,STRING); // Get the line
cout<<STRING + "\n"; // Prints out File line
}
infile.close();
return 0;
}
}
除了一个问题,我已经让这个程序正常工作
如果用户只运行没有文件名的程序(我认为被称为参数),例如./displayfile,那么我得到一个分段错误
如何修改我的代码,以便程序退出并显示错误消息“添加文件名”
我的第一个想法是
if (!argc=2)
{
cout << "ERROR. Enter a file name";
return 1;
}
增加: 以防这个问题正在编译中使用 g ++ displayfile.cpp -o displayfile
答案 0 :(得分:5)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main (int argc, char* argv[]) {
if(argc != 2) {
cout << "You need to supply one argument to this program.";
return -1;
}
string STRING;
ifstream infile;
STRING = argv[1];
infile.open(argv[1]);
if (infile.fail())// covers a miss spelling of a fail name {
cout << "ERROR. Did you make a mistake in the Spelling of the File\n";
return 1;
}
else {
while(!infile.eof()) {
getline(infile,STRING); // Get the line
cout<<STRING + "\n"; // Prints out File line
}
infile.close();
return 0;
}
}
答案 1 :(得分:2)
除了argc != 2
的明显检查之外,我无法帮助修复一些更糟糕的代码和明显的错误:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main (int argc, char* argv[])
{
if (argc != 2)
{
cout << "ERROR. Invalid number of arguments\n";
return 1;
}
ifstream infile(argv[1]);
if (!infile) // covers a miss spelling of a fail name
{
cout << "ERROR. Did you make a mistake in the Spelling of the File\n";
return 1;
}
string STRING;
while(getline(infile, STRING))
cout << STRING << '\n'; // Prints out file line
return 0;
}
你不需要调用ifstream::open
,只需使用构造函数,同样不需要如此早地声明STRING
,也不要将它初始化为文件名,因为你不要使用它。不要忘记,这不是C,你不需要在每个函数的开头都有一大堆声明。
其次,检查流的标志通常是个坏主意,只需检查!infile
以查找任何错误。但真正的错误是在while条件中检查infile.eof
,因为它只在getline
尝试读取文件末尾时才设置,所以你实际上会打印一个(可能是空的)行太多了。只需检查getline
的返回值即可找到任何错误或文件结尾。
输出时不要在字符串上添加换行符,只需在字符串后面输出即可。最后但并非最不重要的是,不需要infile.close
,因为析构函数无论如何都要调用它。
答案 2 :(得分:0)
将STRING = argv[1];
更改为if (argv[1] != null) STRING = argv[1];
但不确定,因此您必须先测试它。