Linux C——标准IO

一、概念

在C语言库中定义一系列对文件输入输出的函数。

二、特点

1.缓冲机制

标准IO的优点就是通过缓冲机制减少系统调用的次数,提高效率,输出的数据暂存在缓冲区,缓冲区刷新或满时输出。

2.流

文件流是一种用于处理文件输入和输出的抽象概念,文件流将文件和C语言的数据处理机制连接起来,使数据的写入(输入流)和读出(输出流)更方便。
默认打开了三个流:stdin(标准输入)、stdout(标准输出)、stderr(标准错误)

三、缓存区

1.行缓存(和终端操作相关)

缓存刷新的条件
1)程序正常退出
2)\n刷新
3)缓存区满刷新
4)fflush函数强制刷新

2.全缓存(和文件操作相关)

缓存刷新的条件:
1)程序正常退出
2)缓存区满刷新
3)强制刷新fflush

3.不缓存:标准错误 strerr

四、函数

1.打开文件

fopen

定义:
FILE *fopen(const char *path, const char *mode);
参数:
    path:打开文件的路径
    mode:打开文件的模式
        r:只读,流被定位到文件开头
        r+:可读可写,流被定位到文件开头
        w:只写,文件不存在创建,文件存在清空,流被定位到文件开头
        w+:可读可写,文件不存在创建,文件存在清空,流被定位到文件开头
        a:追加,文件不存在创建,存在追加,流被定位到文件末尾
        a+:可读可写,文件不存在创建,存在追加,开始进行读时从头读,进行写时流被定位到文件末尾
返回值:
    成功:文件流
    失败:NULL,并且设置errno(错误码)

2.关闭文件

fclose

定义:
    int fclose(FILE* stream);
参数:
    stream:文件流

3.读写文件

3.1按字符读写

fgetc

定义:
    int fgetc(FILE *stream);
功能:
    从文件中读一个字符
参数:
    stream:文件流
返回值:
    成功:读到的字符
    失败或读到文件末尾:EOF(-1)

fputc

定义:
    int fputc(int c, FILE * stream);
功能:
    向文件中写入一个字符
参数:
    c:要写的字符(以字符的ASCII码值传递)
    stream:文件流
返回值:
    成功:写的字符的ASCII
    失败:EOF

补充:
ferror函数用于判断读文件时是否出错,返回非零值表示出错;
feof函数用于判断读文件时是否读到文件末尾,返回非零值表示读到文件末尾;
这两个函数使用时参数只需传入文件流。
示例代码:

#include <stdio.h>
int main()
{
    FILE *fp = fopen("../file/text.txt", "r+");
    if (fp == NULL)
    {
        perror("fopen error");
        return -1;
    }
    printf("fopen success\n");
    fputc('a', fp);
    int ch = fgetc(fp);
    if (ch == EOF)
    {
        if (ferror(fp))
            perror("fgetc error");
        if (feof(fp))
            perror("end file");
        return -1;
    }
    printf("%c\n", ch);
    fclose(fp);
    return 0;
}

向文件中写入了一个字符a并将它读出打印到终端,运行时发现字符被写入到文件中,但是终端并没有打印出该字符。


终端给出的错误提示是已经读到了文件末尾,这说明使用fputc进行写入时,文件中的位置标识符(相当于编辑文档时光标的位置)会自动向后移动一个字符的位置。

3.2按字符串读写

fgets

定义:
    char *fgets(char *s, int size, FILE *stream);
功能:
    从文件中读取一串字符
参数:
    s:存放读取的字符串的首地址
    size:读取的大小
    stream:文件流
返回值:
    成功:读取的字符串的首地址
    失败或读到文件末尾:NULL
特性:
    1.一次调用最多读取一行数据
    2.实际读到个数为size-1个,末尾自动添加\0

fputs

定义:
    int  fputs(const char *s,  FILE *stream);
功能:
    向文件中写字符串
参数:
    s:要写的内容
    stream:文件流
返回值:
    成功:非负整数
    失败:EOF

示例代码:

#include <stdio.h>
int main()
{
    FILE *fp = fopen("../file/text.txt", "r+");
    if (fp == NULL)
    {
        perror("fopen error");
        return -1;
    }
    printf("fopen success\n");
    char str[99]="";
    fputs("qwert",fp);
    fgets(str, 99, fp);
    printf("%s\n", str);
    return 0;
}

和fputc相同,fputs在对文件进行写入结束时,位置标识符会停留在文件末尾,导致读不出数据。

3.3按二进制读写

可以读写任意类型的文件,以二进制的方式进行读写。
fread

定义:
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
    从文件流读取多个元素
参数:
    ptr:用来存放读取元素 (可以用来读取任意类型的数据)
    size:元素大小  sizeof(数据类型)
    nmemb:读取对象的个数
    stream:要读取的文件
返回值:
    成功:读取对象的个数
    读到文件尾或失败:0

fwrite

定义:
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
    按对象写
参数:
    同fread
返回值:
    成功:写的元素个数
    失败 :0

4.文件定位

rewind

定义:
    void rewind(FILE *stream);
功能:
    将文件位置标识符定位到起始位置

fseek

定义:
    int fseek(FILE *stream, long offset, int whence);
功能:
    文件的定位操作
参数:
    stream:文件流
    offset:偏移量:正数表示向后文件尾部偏移,负数表示向文件开头偏移
    whence:相对位置:
        SEEK_SET:相对于文件开头
        SEEK_CUR:相对于文件当前位置
        SEEK_END:相对于文件末尾
返回值:
    成功:0
    失败:-1
注:当打开文件的方式为a或a+时,fseek不起作用

ftell

定义:
    long ftell(FILE *stream);
功能:
    获取位置指针当前的文件位置
参数:
    要检测的文件流
返回值:
    成功:当前的文件位置
    出错:-1


如图,加上rewind语句将文件中的位置标识符定位到文件开头后便可打印出。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇