我正在使用C编程语言开发一个简单的文件拆分器/合并程序。问题是由于某种原因fopen返回NULL,因此,我的程序在fwrite语句处崩溃。我该如何解决?
这是C文件:
int SplitFile(char* filename, char* output, size_t size)
{
char current_file_name[256];
int file_count = 0, i = 0;
FILE *file = fopen( filename, "rb" );
printf("split %s into chunks of %d named\n", filename, size);
if (!file)
return E_BAD_SOURCE;
else
{
output = (char *) malloc(size * sizeof(char));
if (output == NULL)
return E_NO_MEMORY;
else
{
int bytes_read = 0;
FILE *outFile;
do
{
bytes_read = fread(output, sizeof(char), size, file );
sprintf(current_file_name, "%s%04lu\n", "part", file_count++);
outFile = fopen (current_file_name, "wb" ); // THIS RETURNS NULL
fwrite(output, sizeof(char), bytes_read, outFile); //CRASHES ON THIS LINE
}
while ( bytes_read > 0 )
;
//fclose(outFile);
}
}
fclose(file);
printf("...\n");
return 0;
}
正确的做法是在errno
返回errno
时检查fopen
。>
我将猜测您的问题是您试图写入不允许文件名中使用NULL
的文件系统,但也可能是权限问题。
\n
可以返回fopen
的原因很多,包括(但不限于):
这意味着文件可能不存在,或者在访问文件时(例如“只读”或“写保护”)发生了一些权限错误,因此在这些情况下,fopen将返回0(NULL指针)。成功后,它将返回文件指针作为处理程序。
在第一次运行中,用于打开操作的fopen是否返回NULL?
正如Gabe所说,您的问题是文件名中的换行符,这在Windows中是非法的。
在Unix中,对于fopen(),没有理由在./之前加上传递给fopen()的文件名。
就我而言,我在while循环中再次读取同一文件,却忘记了将其关闭。
从存在可执行文件的位置检查为文件指定的路径。就我而言,当两个文件都位于同一位置时,我正在c文件中打开文本文件。它一直在给出找不到文件的错误。将文件放在可执行文件的文件夹中,它开始工作。
就我而言,这是因为我试图在不存在的目录