C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(中)

简介: C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose

C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(上):https://developer.aliyun.com/article/1513226


4. 文件的顺序读写

首先要了解什么是读写:我们写的程序是在内存中,而数据是要放到文件中的,文件又是在硬盘上的。当我们把文件里的数据读到内存中去时,这个动作我们称之为输入/读取。反过来,如果把程序中的东西放到硬盘上,这个动作我们称之为输出/写入。

顺序读写,顾名思义就是按照顺序在文件中读和写。

顺序读写函数表


4.IO流:高度抽象的概念

观察刚才的表格我们可以发现有的函数是适用于所有xx流的(比如 fputc 函数)。

fputc 就适用于所有输出流,也就是说它不仅仅可以给文件里写。我们来读一下MSDN的介绍:

那么 stdout 是什么呢?

stdout 就是标准输出流,在这里,要讲一下流的概念。

当写一个程序,但不同的程序我们可能想写到不同的地方



C语言默认打开的3个流:

① stdin - 标准输入流 - 键盘

② stdout - 标准输出流 - 屏幕

③ stderr - 标准输出流 - 屏幕

我们用流向屏幕上输出信息 sputc- stdout:

 
#include <stdio.h>
int main() 
{
    fputc('a', stdout);
    fputc('b', stdout);
    fputc('c', stdout);
    return 0;
}

运行结果:

fgetc 从标准输入流读取 - stdin

 
#include <stdio.h>
// 使用fgetc从标准输入流中读
int main()
{
    int ret = fgetc(stdin);
    printf("%c\n", ret);
    ret = fgetc(stdin);
    printf("%c\n", ret);
    ret = fgetc(stdin);
    printf("%c\n", ret);
    return 0;
}

这里只读取三次(下面有这些函数和其他函数的介绍)

输入hello运行结果:


4.1字符输出函数 fputc

介绍:将参数 char 指定的字符写入到指定的流 stream 中,并把位置标识符向前移动

(字符必须为一个无符号字符)。适用于所有输出流。

代码演示:创建一个 test.txt,随后使用 fputc 函数分别写入 "abc" 到文件中

 
#include <stdio.h>
int main() 
{
    FILE* pf = fopen("test.txt", "w");
    if (pf == NULL) 
    {
        perror("fopen");
        return 1;
    }
    // fputc写文件
    fputc('a', pf);
    fputc('b', pf);
    fputc('c', pf);
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
} 


运行后打开工程文件夹可以成功看到 test.txt 被创建了(大小为1kb可以看出写入成功了):

打开 test.txt发现abc被成功写进去了

测试下 w 的覆盖效果,把写的内容注释掉:

 
#include <stdio.h>
int main()
{
    FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    // fputc写文件
    //fputc('a', pf);
    //fputc('b', pf);
    //fputc('c', pf);
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

此时再次运行,我们发现那个文件里的内容不见了(大小也变为0kb):


值得注意的是,文件的写入是有顺序的。abc,先是a,然后是b,最后是c。


4.2字符输入函数 fgetc

介绍:从指定的流 stream 获取下一个字符,并把位置标识符向前移动(字符必须为一个无符号字符)。如果读取成功会返回相应的ASCII码值,如果读取失败它会返回一个EOF。适用于所有输入流。

码演示:在工程文件夹里打开 test.txt ,随便手动写入一些数据保存,随后使用 fgetc 函数读取:

 
#include <stdio.h>
// 使用fgetc从文件里读
int main()
{
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    // 读文件
    int ret = fgetc(pf);
    printf("%c\n", ret);
    ret = fgetc(pf);
    printf("%c\n", ret);
    ret = fgetc(pf);
    printf("%c\n", ret);
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果如下:

注意:读取结束或者遇到错误时会返回EOF(值是-1)。

C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(下):https://developer.aliyun.com/article/1513238

目录
相关文章
|
4天前
|
存储 监控 Linux
性能分析之从 IO 高定位到具体文件
【8月更文挑战第21天】性能分析之从 IO 高定位到具体文件
11 0
性能分析之从 IO 高定位到具体文件
|
12天前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
16 4
|
9天前
IO流拷贝文件的几种方式
IO流拷贝文件的几种方式
22 1
|
12天前
|
编译器 程序员 C语言
【C语言篇】从零带你全面了解函数(包括隐式声明等)(下篇)
⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。
|
12天前
|
存储 编译器 C语言
【C语言篇】深入理解指针2
代码 const char* pstr = "hello world."; 特别容易让初学者以为是把字符串 hello world.放 到字符指针 pstr ⾥了,但是本质是把字符串 hello world. 首字符的地址放到了pstr中。
|
12天前
|
存储 程序员 编译器
【C语言篇】深入理解指针1
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。
|
8天前
|
机器学习/深度学习 编译器 Serverless
C语言中函数
C语言中函数
16 0
|
8天前
|
存储 Serverless C语言
C语言中的标准库函数
C语言中的标准库函数
13 0
|
12天前
|
C语言
【C语言】epoll函数
【C语言】epoll函数
13 0
|
12天前
|
C语言
【C语言】指针速览
【C语言】指针速览
13 0
下一篇
云函数