C++ ifstream始终返回“0”;ELF";反对
我编写了以下方法来检查我的程序是否能正确地使用文件IO,但它肯定不能工作。我从Infle那里得到的只是“精灵”,有人能告诉我为什么吗?我的对象与其他类型的iStream配合得非常好C++ ifstream始终返回“0”;ELF";反对,c++,file-io,io,fstream,ifstream,C++,File Io,Io,Fstream,Ifstream,我编写了以下方法来检查我的程序是否能正确地使用文件IO,但它肯定不能工作。我从Infle那里得到的只是“精灵”,有人能告诉我为什么吗?我的对象与其他类型的iStream配合得非常好 void testFiles(int ct, char ** args) { if(ct<2){ cout<<"Invalid number of arguments. Must be two files, one for input, one for output."<
void testFiles(int ct, char ** args)
{
if(ct<2){
cout<<"Invalid number of arguments. Must be two files, one for input, one for output."<<endl;
return;
}
ifstream inFile;
inFile.open(args[0]);
Tree<Word,int> x;
Word *key;
Word *val;
cout<<"Tree extracted from file: "<<endl;
while(inFile.good()&&inFile.is_open()){
key = new Word();
val = new Word();
inFile>>*key;
inFile>>*val;
if(!inFile.good()){
cout<<"Error: incomplete key-value pair:"<<key->getStr()<<endl;
break;
}
cout<<key->getStr()<<" "<<val->getStr()<<endl;
x[*key] = val->asInt();
delete key;
delete val;
}
inFile.close();
ofstream outFile;
outFile.open(args[1]);
cout<<"Tree as read from file:"<<endl<<x;
outFile<<x;
outFile.close();
}
void测试文件(int-ct,char**args)
{
if(ctargs[0]不是程序的第一个参数。它是可执行文件本身的名称
发生的情况是,您正在打开自己的可执行文件,而不是命令行上指定的文件,并且由于您的程序是linux二进制文件,因此您正在读取ELF二进制文件开头的神奇字符串,即“ELF”
若要修复错误,请将args[0]更改为args[1]。args[0]不是程序的第一个参数。它是可执行文件本身的名称
发生的情况是,您正在打开自己的可执行文件,而不是命令行上指定的文件,并且由于您的程序是linux二进制文件,因此您正在读取ELF二进制文件开头的神奇字符串,即“ELF”
要修复此错误,请将args[0]更改为args[1]。您指定的是程序名,而不是第一个参数作为文件名
检查您所做操作的有效性是一个好主意。即,检查参数[1]
是否为空和/或文件打开的返回值…仅检查参数计数是不够的。您指定的是程序名,而不是第一个参数作为文件名
检查您所做操作的有效性是一个好主意。例如,检查args[1]
是否为空和/或文件打开的返回值…仅检查参数计数是不够的。为了澄清,Word是一个自定义字符串对象,在infle>*key;之后,key具有字符串“ELF”在它内部。这不会发生在任何其他iStream中。您使用什么作为args
的值?如果您使用main
中的argv
,则argv[0]
(从而args[0]
)是可执行文件的名称,您正在打开可执行文件。在Linux中,可执行文件使用名为ELF
的格式存储。猜猜ELF
文件的前三个字节是什么?您的语法太糟糕了。请不要使用C90样式的变量声明。如果您需要key
和val
内部循环,然后在那里声明它们。我想Word
不够大,不足以证明堆上的分配是正确的。除了Kay的评论:当您创建一个对象,例如outFile
,将可用的参数传递给构造函数:of stream outFile(args[1])
。为了澄清这一点,Word是一个自定义字符串对象,在infle>>*key;之后,key中有字符串“ELF”。这在任何其他iStream中都不会发生。您使用的是args的值是什么?如果您使用的是main
中的argv
,则argv[0]
(因此args[0]
)是可执行文件的名称,您正在打开可执行文件。在Linux中,可执行文件使用名为ELF
的格式存储。猜猜ELF
文件的前三个字节是什么?您的语法太糟糕了。请不要使用C90样式的变量声明。如果您需要key
和val
内部循环,然后在那里声明它们。我想Word
不够大,不足以证明堆上的分配是正确的。除了Kay的评论:当您创建一个对象,例如outFile
,将可用的参数传递给构造函数:of stream outFile(args[1])
。谢谢,这就解决了。我会尽快给你核对答案me@Dazedy是的,如果你不习惯C或C++,我能理解。而且,如果这个代码是在Windows上的,我相信你的程序会崩溃。@杰西古德:如果它在Linux上工作,我想不出它为什么不能在Windows上工作。它只会返回“MZ”这个词。而不是“精灵”@SecurityMatt:对不起,我想在可执行文件运行时覆盖它,而不是从中读取。在windows中这是不允许的,但在linux上是可能的。谢谢,这解决了它。我会尽快给你检查答案me@Dazedy是的,如果你不习惯C或C++,我可以理解。相信你的程序会崩溃。@JesseGood:如果它能在Linux上工作,我想不出为什么它不能在Windows上工作。它只会返回“MZ”而不是“ELF”.@SecurityMatt:对不起,我想在可执行文件运行时覆盖它,而不是从中读取。在windows中这是不允许的,但在linux上是可能的。@Kupto:您能建议我需要在命令行上指定什么,以“将空引用作为参数发送到程序”结束吗?这听起来似乎违反了C标准,main的参数是int argc,char**argv,其中argc>=1,argv持有argc数量的char*s?@SecurityMatt首先,程序不会仅从命令行调用,其次,您可能会喜欢这样:@SecurityMatt在5.1.2.2.1中C标准保证argv[argc]==NULL
。当然,这不是一个“NULL引用”,但是如果您运行的程序没有参数(相当常见),argv[1]
是NULL
。另一方面,我不相信有要求argv[I]
对于i
的值不能为NULL。尽管如此,我认为这种情况在实践中极不可能发生。@Kupto我认为术语“NULL reference”令人困惑,您可能想修改它。@Nikbugalis:您可能有兴趣阅读C标准的5.1.2.2.1,其中包括“argv[0]到argv”[argc-1]应包含指向字符串的指针”和“argv数组指向的字符串应可由程序修改”,这保证它们不为空。即使