在函数中使用fopen打开文件

5

我正在使用Visual Studio 2005 (C\C++)。

我将一个字符串作为char数组传递给函数。我想打开作为参数传递的文件并使用它。我知道我的代码在某种程度上是有效的,因为如果我将文件名硬编码为第一个参数,它就可以完美地工作。

我注意到,如果我将值作为监视器查看,该值包括字符串文字旁边的地址。我尝试将文件名作为指针传递,但它会抱怨与__w64的类型转换。正如我之前所说,用"filename.txt"代替fileName时它可以正常工作。我被难住了。

void read(char fileName[50],int destArray[MAX_R][MAX_C],int demSize[2])
{
    int rows=0;
    int cols=0;
    int row=0;
    int col=0;
    FILE * f = fopen(fileName,"r");
...

调用函数的代码如下:
char in_filename[50];
int dem[MAX_R][MAX_C]; 
int dem_size[2];
get_user_input( in_filename);
read(in_filename, dem, dem_size );

在我的手表中,文件名的正确文本出现了,因此数据已经传递过来了。

嗯...我经常使用MinGW来做这件事。稍后打开文件的函数会传递参数“const char * filename” - MinGW从未对此抱怨过。 - mingos
1个回答

5
如果您正在使用fopen(),则您正在使用C编程语言,而不是C ++。此外,这不是将数组传递给函数的方法。参数列表的语法为:
void f(char arr[], unsigned int arr_size);

在多维数组的情况下,您必须明确指定最右侧维度的大小:

void f(char arr[][20], unsigned int arr_size);

话虽如此,尝试将参数从char fileName [50]更改为char* fileName


我的错误 - 将参数更改为char *文件名可以成功编译,但是文件指针无效,并且在fscan尝试使用它时会导致错误。 - Joshua Enfield
您确定该文件名的文件存在吗?您确定您的工作目录是文件所在的目录吗? - wilhelmtell
我在问题中添加了调用代码。 是的,我可以将“filename.txt”放在文件名的位置上,它可以正常工作。如果我为文件名添加一个监视器,我会看到传递给函数的相同字符串字面量。 - Joshua Enfield
如果文件存在,您是否在类Unix平台上?如果是,则从unistd.h头文件中获取getcwd()的输出并检查它是否是文件所在的目录。如果您在Windows上,则该函数为_getcwd(),我相信它在direct.h头文件中。 - wilhelmtell
我已经搞定了。问题出在我的读取输入上。我在读取输入时包含了换行符。在更改这个问题后,按照您的建议修改参数,它就像魔法般地运行了。非常感谢您的建议和帮助,我非常感激。 - Joshua Enfield
@Josh:你应该测试fopen()函数的返回值——如果返回了NULL,则执行perror("fopen");,你将得到一个漂亮的错误信息告诉你问题所在——这通常有助于极大地跟踪解决此类问题。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接