21

我正在使用 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;
}
4

8 回答 8

22

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

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

于 2011-05-13T05:43:13.723 回答
11

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

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

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

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

于 2011-05-13T06:03:32.323 回答
2

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

fp=fopen("c:\\ABC.txt", "r");不能与 相同fp=fopen("c:\\abc.txt", "r");

在 Linux 环境中使用//,而不是。\\

PS:在 Linux 和类 Unix 操作系统中,文件名区分大小写

于 2014-02-25T09:07:20.670 回答
0

fopen for write 在第一次运行时返回 NULL 吗?

我注意到在您保留打开的文件以进行写入但没有关闭它们的同时。

尝试在 fwrite 之后添加 fclose(outFile):

outFile =  fopen ( current_file_name , "wb" );    
fwrite(output, sizeof( char ), bytes_read, outFile); 
fclose(outFile)

您打开的文件可能比操作系统允许的多。

于 2011-05-13T05:49:46.800 回答
0

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

于 2015-01-21T07:44:41.713 回答
0

就我而言,我在 while 循环中再次读取同一个文件并忘记关闭它。

我使用了一个函数来读取文件并找到匹配项,并且该函数有一个return;语句在执行之前终止了该函数fclose(fp):D

于 2017-10-09T15:19:14.953 回答
0

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

于 2019-02-20T10:22:55.647 回答
0

就我而言,这是因为我试图在不存在的目录中创建文件。

于 2019-10-03T07:55:59.070 回答