📜  C C++中文件操作期间的错误处理(1)

📅  最后修改于: 2023-12-03 14:59:35.837000             🧑  作者: Mango

C/C++中文件操作期间的错误处理

在C/C++中,文件操作是一个常见的操作。无论是读取文件内容,还是写入文件内容,都有可能出现各种各样的错误。这些错误包括文件不存在、打开文件失败、读写文件错误等。程序员在进行文件操作时,应该注意如何正确处理这些错误以提高程序的可靠性。

文件打开操作中的错误处理

在进行文件操作之前,我们通常需要先打开文件。在打开文件时,可能会出现各种错误。下面是一些常见的文件打开错误和如何处理它们的示例代码。

文件不存在

如果指定的文件不存在,打开文件时会出现 File not found 的错误。可以使用 fopen() 函数打开文件,并检查返回值,如果返回值为 NULL,表示文件打开失败。此时,可以通过输出错误信息提示用户输入正确的文件名。

FILE* fp;
char filename[MAX_FILENAME_LENGTH];

printf("Please enter the filename: ");
scanf("%s", filename);

/* try to open the file */
fp = fopen(filename, "r");
if (fp == NULL)
{
    printf("Error: File not found.\n");
    exit(1);
}

/* file opened successfully, do something with it */
文件权限不足

如果指定的文件有权限问题,比如没有读或写的权限,打开文件时会出现 Permission denied 的错误。可以使用 fopen() 函数的第二个参数指定打开文件的方式(读、写、追加等)。如果需要修改文件内容,需要先检查文件权限,如果没有写权限,则输出错误信息提示用户修改文件权限。

FILE* fp;
char filename[MAX_FILENAME_LENGTH];

printf("Please enter the filename: ");
scanf("%s", filename);

/* try to open the file for writing */
fp = fopen(filename, "w");
if (fp == NULL)
{
    printf("Error: Permission denied.\n");
    exit(1);
}

/* check file permission */
if (access(filename, W_OK) == -1)
{
    printf("Error: File permission cannot be modified.\n");
    exit(1);
}

/* file opened successfully, do something with it */
文件被占用

如果打开一个已经被其他程序或进程占用的文件,打开文件时会出现 File in use 的错误。可以使用 fopen() 函数的第三个参数指定共享模式(允许多个进程同时访问文件)。如果需要修改文件内容,需要先检查文件是否被占用,如果被占用,则输出错误信息提示用户等待或终止其他进程占用该文件。

FILE* fp;
char filename[MAX_FILENAME_LENGTH];

printf("Please enter the filename: ");
scanf("%s", filename);

/* try to open the file with shared mode */
fp = fopen(filename, "w, sh");
if (fp == NULL)
{
    printf("Error: File in use.\n");
    exit(1);
}

/* check file usage */
if (access(filename, F_OK) == -1)
{
    printf("Error: File not found.\n");
    exit(1);
}

/* file opened successfully, do something with it */
文件读取操作中的错误处理

当打开文件成功后,我们通常需要读取文件内容。在读取文件内容时,可能会出现各种错误。下面是一些常见的文件读取错误和如何处理它们的示例代码。

读取文件错误

当读取文件错误时,会出现 Read file error 的错误。可以使用 fread() 函数读取文件,并检查返回值,如果返回值小于请求的字节数,表示可能读取到了文件末尾或者发生了其他错误。此时,可以通过输出错误信息提示用户检查文件是否完整。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE* fp;
    char filename[100];
    char buf[1024];
    size_t bytes_read;

    printf("Please enter the filename: ");
    scanf("%s", filename);

    /* open the file */
    fp = fopen(filename, "rb");
    if (fp == NULL)
    {
        printf("Error: Could not open file.\n");
        exit(1);
    }

    /* read the file */
    bytes_read = fread(buf, 1, sizeof(buf), fp);
    if (bytes_read < sizeof(buf))
    {
        if (feof(fp))
        {
            printf("Error: End of file reached unexpectedly.\n");
        }
        else if (ferror(fp))
        {
            printf("Error: Read file error.\n");
        }
    }

    /* close the file */
    fclose(fp);

    return 0;
}
写入文件错误

当写入文件错误时,会出现 Write file error 的错误。可以使用 fwrite() 函数写入文件,并检查返回值,如果返回值小于请求的字节数,表示可能写入失败或者发生了其他错误。此时,可以通过输出错误信息提示用户检查磁盘空间是否足够。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE* fp;
    char filename[100];
    char buf[] = "This is a test message.";
    size_t bytes_written;

    printf("Please enter the filename: ");
    scanf("%s", filename);

    /* open the file */
    fp = fopen(filename, "wb");
    if (fp == NULL)
    {
        printf("Error: Could not open file.\n");
        exit(1);
    }

    /* write to the file */
    bytes_written = fwrite(buf, 1, sizeof(buf), fp);
    if (bytes_written < sizeof(buf))
    {
        printf("Error: Write file error.\n");
        exit(1);
    }

    /* close the file */
    fclose(fp);

    return 0;
}
总结

在进行文件操作时,我们需要根据不同的情况,正确地处理文件相关的错误。错误处理的好处在于改进程序的可靠性,避免因用户错误操作而导致的程序崩溃,保持程序的正常运行。