为什么'fopen'返回NULL指针?

k78*_*787 14 c null fopen fwrite

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

Gab*_*abe 15

正确的做法是检查errno何时fopen返回NULL.

我猜你的问题是你试图写入一个不允许\n文件名的文件系统,但它也可能是一个权限问题.


Jar*_*Par 10

fopen可以返回的原因有很多,NULL包括(但肯定不限于):

  • 该文件不存在
  • 该文件以不允许其他访问的模式打开
  • 网络瘫痪了
  • 该文件存在,但您没有权限
  • 存在一个文件,其中包含您提供的名称,但该进程的当前目录不是您所期望的,因此相对路径名无法找到并打开该文件.

找出哪个是负责任的方法是深入研究errno代码.

但是,仅仅因为您解决了这个特定错误并不意味着您可以假设fopen永远不会返回NULL.在处理I/O操作时,您的代码只需要预期失败.无法预测I/O操作的成功,它们总是会失败.