C++ ifstream始终返回“0”;ELF";反对

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."<

我编写了以下方法来检查我的程序是否能正确地使用文件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."<<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数组指向的字符串应可由程序修改”,这保证它们不为空。即使