四时宝库

程序员的知识宝库

C语言备忘录 - 18. 文件基础(c语言文件怎么写)

一、打开关闭文件

1. 打开文件

#include <stdio.h>

FILE *fopen(const char *filepath, const char *mode);

字符串 filepath 表示文件路径,可以是相对路径或绝对路径。字符串 mode 是访问模式,其值可以是下列情况:

  • r :以只读模式打开一个已有的文本文件,从文件头开始读取。
  • w :以只写的模式打开一个文本文件,从文件头开始写入。如果文件不存在,则创建新文件。写入会覆盖文件全部内容。
  • a :以追加的模式打开一个文本文件,从文件末尾追加内容。如果文件不存在,则创建新文件。
  • r+ :以读和写的模式打开一个已有的文本文件,从文件头开始读取和写入。覆盖写入位置的内容,其他位置内容保留。
  • w+ :以读和写的模式打开一个文本文件,从文件头开始读取和写入。如果文件不存在,则创建新文件。写入会覆盖文件全部内容。
  • a+ :以读和追加的模式打开一个文本文件,从文件末尾追加内容。如果文件不存在,则创建新文件。

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

如果打开文件成功该方法会返回一个指向 FILE 结构的指针,如果失败则返回 NULL 并设置 errno 错误。

2. 关闭文件

#include <stdio.h>

int fclose(FILE *fp);

用于关闭先前由 fopen 函数打开的文件。如果成功关闭文件,fclose( ) 函数返回 0,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。注意文件操作完成后应及时关闭文件。

3. 示例

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

int main()
{
  /* 定义一个指向文件类型的指针 */
  FILE *fp;
  int ch;

  /* 以只读模式打开本地 hello.txt 文件 */
  fp = fopen("./hello.txt", "r");

  if (fp == NULL) {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }

  /* 循环从文件中读取一个字符 */
  while ((ch = fgetc(fp)) != EOF) {
    putchar(ch);
  }
  putchar('\n');

  /* 关闭文件 */
  fclose(fp);
  
  return 0;
}

二、文件指示器

#include <stdio.h>

int feof(FILE *stream);
int ferror(FILE *stream);
void clearerr(FILE *stream);
  • feof() 用于检测文件的末尾指示器是否被设置。返回一个非 0 值;如果检测不到末尾指示器被设置,返回值为 0。
  • ferror() 用于检测文件的错误指示器是否被设置。返回一个非 0 值;如果检测不到错误指示器被设置,返回值为 0。
  • clearerr() 用于清除指定文件的末尾指示器和错误指示器。
#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fp;
  int ch;

  /* 以只读模式打开文件 */
  if ((fp = fopen("./hello1.txt", "r")) == NULL) {
    printf("打开文件失败!\n");
    exit(EXIT_FAILURE);
  }

  while (1) {
    ch = fgetc(fp);
    /* 判断读取文件时是否存在错误 */
    if (ferror(fp)) {
      printf("读取文件时出错...\n");
      break;
    }
    /* 如果读取到文件末尾,就结束读取 */
    if (feof(fp)) {
      break;
    }
    putchar(ch);
  }

  /* 清理错误指示器与末尾指示器 */
  clearerr(fp);

  /* 关闭文件 */
  fclose(fp);

  return 0;
}

三、错误信息

在发生错误时,大多数的函数调用会返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是全局变量,表示在函数调用期间发生了错误。我们可以在 errno.h 头文件中找到各种各样的错误代码。

C 语言提供了 perror() 和 strerror() 函数来显示与 errno 相关的文本消息。

  • perror() 函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。
  • strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

extern int errno;

int main()
{
  FILE *pf;
  int errnum;

  pf = fopen("unexist.txt", "rb");
  if (pf == NULL) {
    errnum = errno;
    
    /* 输出错误号到标准错误输出 */
    fprintf(stderr, "错误号: %d\n", errnum);
    /* 获取错误号的文本说明 */
    fprintf(stderr, "错误信息: %s\n", strerror(errnum));
    /* 使用 perror 打印错误信息 */
    perror("通过 perror 输出错误");

    /* 设置退出状态为 EXIT_FAILURE */
    exit(EXIT_FAILURE);
  }
  
  /* 关闭文件 */
  fclose(pf);

  return 0;
}

通常情况下,程序成功执行完一个操作正常退出的时候会带有值 EXIT_SUCCESS(值为 0 的宏)。而如果存在错误的情况,当您退出程序时,会带有状态值 EXIT_FAILURE(值为 -1 的宏)。

我们还可以使用重定向将错误信息打印到指定为文件:

# 将标准错误输出重定向到指定文件
$ gcc test.c && ./a.out 2> error.log

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接