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

问题描述 投票:12回答:9

我正在使用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;
}
c null fopen fwrite
9个回答
13
投票

正确的做法是在errno返回errno时检查fopen。>

我将猜测您的问题是您试图写入不允许文件名中使用NULL的文件系统,但也可能是权限问题。


8
投票

\n可以返回fopen的原因很多,包括(但不限于):


1
投票

这意味着文件可能不存在,或者在访问文件时(例如“只读”或“写保护”)发生了一些权限错误,因此在这些情况下,fopen将返回0(NULL指针)。成功后,它将返回文件指针作为处理程序。


0
投票

在第一次运行中,用于打开操作的fopen是否返回NULL?


0
投票

正如Gabe所说,您的问题是文件名中的换行符,这在Windows中是非法的。


0
投票

在Unix中,对于fopen(),没有理由在./之前加上传递给fopen()的文件名。


0
投票

就我而言,我在while循环中再次读取同一文件,却忘记了将其关闭。


0
投票

从存在可执行文件的位置检查为文件指定的路径。就我而言,当两个文件都位于同一位置时,我正在c文件中打开文本文件。它一直在给出找不到文件的错误。将文件放在可执行文件的文件夹中,它开始工作。


0
投票

就我而言,这是因为我试图在不存在的目录

© www.soinside.com 2019 - 2024. All rights reserved.