我正在使用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;
}
答案 0 :(得分:11)
正确的做法是在fopen
返回NULL
时检查errno
。
我猜你的问题是你试图写入文件系统中不允许\n
的文件系统,但它也可能是一个权限问题。
答案 1 :(得分:7)
fopen
可以返回NULL
的原因有很多,包括(但肯定不限于):
找出负责任的方法是深入研究errno
代码。
但是,仅仅因为您解决了这个特定错误并不意味着您可以假设fopen
永远不会返回NULL
。在处理I / O操作时,您的代码只需要预期失败。无法预测I / O操作的成功,它们总是会失败。
答案 2 :(得分:1)
正如Gabe所说,你的问题是文件名中的换行符,这在Windows中是非法的。
但是你为什么不使用GNU Core Utilities中的split。默认情况下安装在Unices / Linux上,可以从GnuWin32 project下载Windows。
split --suffix-length=4 --numeric-suffixes --bytes=1M - part < filename
答案 3 :(得分:1)
这意味着在访问“只读”或“写保护”等文件时文件可能不存在或发生某些权限错误,因此在这些情况下fopen将返回0(NULL指针)。成功时,它将返回一个文件指针作为处理程序。
fp=fopen("c:\\ABC.txt", "r");
不能与fp=fopen("c:\\abc.txt", "r");
相同。
在Linux环境中使用//
代替\\
。
P.S。:在Linux和类Unix操作系统中,文件名区分大小写。
答案 4 :(得分:0)
fopen for write在第一次运行时返回NULL吗?
我注意到,在你打开文件进行写入但没有关闭它们的时候。
尝试在fwrite后添加fclose(outFile):
outFile = fopen ( current_file_name , "wb" );
fwrite(output, sizeof( char ), bytes_read, outFile);
fclose(outFile)
您可以打开比操作系统允许的文件更多的文件。
答案 5 :(得分:0)
在Unix中,对于fopen(),没有理由将./添加到传递给fopen()的文件名中。
答案 6 :(得分:0)
在我的情况下,我在while循环中再次读取同一个文件,忘了关闭它。
我使用了一个函数来读取文件并查找匹配项,函数有一个return;
语句,在执行fclose(fp)
之前终止了该函数:D
答案 7 :(得分:0)
从存在可执行文件的任何位置检查为文件指定的路径。 就我而言,当两个文件都位于同一位置时,我正在c文件中打开文本文件。 它一直在给出找不到文件的错误。 将文件放在可执行文件的文件夹中,它开始工作。
答案 8 :(得分:0)
在我的情况下,这是因为我试图在不存在的目录中创建文件。