2016-04-09 55 views
-5

我有一个程序,应该从命令行使用argc和argv文件的名称。打印argv [1]和argv [2]向我显示我传递的确切名称,但是传递argv [1]和argv [2]作为参数以在另一个函数中打开文件,只显示如果打不开的错误行文件。
我的主:用argv打开文件给我的文件NULL

int main(int argc, char* argv[]) 
{ 
    if (argc != 4) 
    { 
     puts("Incorrect number of parameters."); 
     return 1; 
    } 
    else 
    { 
    Image *a, *b; 

    a = OpenFile(argv[1]); 
    b = OenFile(argv[2]); 

    } /* else */ 
    return 0; 
} /* main */ 

功能的OpenFile将返回充满了从文件信息的结构体。这是该功能的第一部分:

Image *OpenFile(char* name) 
{ 
    FILE* f = fopen(name, "r"); 
    Image* imagem; 
    int temp, i, cont, data[MAX]; 
    char aux[2]; 

    if(f == NULL)  
    { 
     puts("Error opening file."); 
     return NULL; 
    } /* if */ 
    ... 
} 

我传递了正确的名称,但收到“错误打开文件”。为每个文件尝试打开。

编辑:它给我“没有这样的文件或目录”,但我将这些文件复制到.exe所在的目录。这不是我第一次从命令行使用文件名,但这是我第一次将参数传递给另一个函数。

+0

从您所提供的信息很少errno.h中,合乎逻辑的结论似乎是,你的程序试图打开该文件时遇到错误。 –

+0

请提供您传递给程序的文件的名称。我们不知道您是如何编译代码以及在构建过程之后放置可执行文件的位置。也许你的输出目录不包含你正在尝试阅读的文件。 – Kamil

+0

当然,你传递的完全合格的绝对文件规范是完全明确的? –

回答

3

从FOPEN手册页:

RETURN VALUE 

成功完成后fopen()函数,fdopen()和freopen函数()返回一个文件指针。否则,返回NULL,并设置errno来指示错误。

所以你可以改变:

if(f == NULL)  
{ 
    puts("Error opening file."); 
    return NULL; 
} /* if */ 

有了:

if(f == NULL)  
{ 
    perror("fopen"); 
    return NULL; 
} /* if */ 

而且你会在的fopen失败的原因得到了很好地说明了消息。

您应该包括以使用PERROR

+1

甚至更​​好地将* filename *传递给'perror'。 –

+0

@AnttiHaapala是的,这会更好,它会使调试更容易。接得好! – sestus

+0

我现在试试这个。谢谢! – Inn