文件编程--标准IO

ggg

linux中一切皆文件,对文件的操作步骤分为三步

1.打开2.读写3.关闭

标准IO库 ---- stdio中有对应的函数

1.打开

fopen

2.读写

fgetc/fputc

fgets/fputs

fread/fwrite

一切皆文件的思想简化linux对文件的处理,可以使用统一的操作逻辑

fopen

打开文件

头文件

#include <stdio.h>

函数原型

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

说明:参数 path 字符串包含欲打开的文件路径及文件名,参数 mode 字符串则代表着文本流的形态,有下列几种形态字符串。(path为要打开的文件名【一般为argv数组元素】,mode是打开的模式)

r 打开只读文件,该文件必须存在。

r+ 打开可读写的文件,该文件必须存在。

w 打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则建立该文件。

a 以附加的方式打开只写文件,若文件不存在,则会建立该文件;若文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

a+ 以附加方式打开可读写的文件,若文件不存在,则会建立该文件;若文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

返回值:文件顺利打开后,指向该流的文件指针就会被返回。若文件打开失败则返回 NULL,并把错误代码存在 errno 中。

复制代码
  1 #include<stdio.h>
  2 #include<fcntl.h>
  3 
  4 
  5 int main(int argc, const char *argv[])
  6 {
  7     if (argc != 2) {
  8         printf(" %s <file>\n", argv[0]);
  9         return 1;
 10     }
 11     FILE*pf=fopen("argv[1]","w");
 12     if(pf==NULL)
 13     {
 14         perror("fopen fail\n");                                                                                                                                                  
 15         return -1;
 16     }else
 17     {
 18         printf("yes\n");
 19     }
 20 
 21     return 0;
 22 }
~    

fgetc

int fgetc(FILE * stream);

复制代码
  1 #include<stdio.h>
  2 #include<fcntl.h>
  3 
  4 // ./a.out 1.txt
  5 int main(int argc, const char *argv[])
  6 {
  7     FILE*pf=fopen("1.txt","r");
  8     if(pf==NULL)
  9     {
 10         perror("fopen fail\n");
 11         return -1;
 12     }else
 13     {                                                                                                                                                                            
 14         printf("yes\n");
 15     }
 16     int ret=fgetc(pf);
 17     printf("ret = %c:%d",ret,ret);
 18     
 19     return 0;
 20 }

#include<stdio.h>

int main()   //cat
{
    FILE *fp;
    int c;
    fp=fopen("exist", "r");
    while((c = fgetc(fp)) != EOF)
        printf("%c", c);
    fclose(fp);
}

fgets

char * fgets(char * s,int size,FILE * stream);

实现cat功能并输出文件行数(利用读取到'/n'fgets会结束的情况【'\n'保留在ret字符串中】)

复制代码
  1 #include<stdio.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     FILE*p=fopen("fgetc.c","r");                                                                                                                                                 
  5     char ret[1024];
  6     int cnt=0;
  7     while(1)
  8     {
  9         if(fgets(ret,1024,p)==NULL)
 10             break;
 11         printf("%s",ret);
 12         cnt++;
 13     }
 14     putchar('\n');
 15     printf("cnt = %d\n",cnt);
 16     return 0;
 17 }

读取结束的情况:

1.读到文件末尾EOF

2.读取到\n说明:\n会被保存到buffer中

3.读取到size-1字符(fgets中的参数,最后会补上'\0')

fputc

int fputc(int c,FILE * stream);

说明:fputc 会将参数 c 转为 unsigned char 后写入参数 stream 指定的文件中。

复制代码
  1 #include<stdio.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     if (argc < 2) {
  5         printf("用法: %s <文件名>\n", argv[0]);
  6         return 1;
  7     }
  8     FILE*p=fopen(argv[1],"r");
  9     int ret=fgetc(p);
 10     while(ret!=EOF)
 11     {
 12         fputc(ret,stdout);
 13         ret = fgetc(p);
 14     }                                                                                                                                                                            
 15     return 0;
 16 }

默认打开文件(in、out、err)

系统默认打开有三个文件

名称 文件描述符(FD)

stdin 0

stdout 1

stderr 2

stdout与stderr类似,都是输出到屏幕(终端),不过为了性能考虑,stdout有缓冲区,达到一定条件才输出,在系统崩溃的情况下stdout没来得及输出就会被清零,而stderr没有缓冲区,避免了上述情况。

stdin默认从键盘上取数据,总的来说就是从外界得到数据,不局限于键盘

fputs

int fputs(const char * s, FILE * stream);

复制代码
#include <stdio.h>

int main()
{
    char s[80];
    fputs(fgets(s,80,stdin),stdout);
}

fwrite

size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);

说明:fwrite() 用来将数据写入文件流中。参数 stream 为已打开的文件指针,参数 ptr 指向欲写入的数据地址,总共写入的字符数以参数 size*nmemb 来决定。fwrite() 会返回实际写入的 nmemb 数目。

复制代码
#include <stdio.h>
#define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}
#define nmemb 3
struct test
{
    char name[20];
    int size;
}s[nmemb];

int main()
{
    FILE * stream;
    set_s(0, "Linux!");
    set_s(1, "FreeBSD!");
    set_s(2, "Windows2000.");
    stream = fopen("/tmp/fwrite", "w");
    fwrite(s, sizeof(struct test), nmemb, stream);
    fclose(stream);
    return 0;
}

fread

size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);

说明:fread() 用来从文件流中读取数据。参数 stream 为已打开的文件指针,参数 ptr 指向欲存放读取进来的数据空间,读取的元素大小与个数 size和nmemb 来决定。fread() 会返回实际读取到的 nmemb 数目,如果此值比参数 nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用 feof() 或 ferror() 来决定发生什么情况。(size_t是无符号类型,返回值不会是负数,当返回值比nmemb小时通过ferror查看运行情况)

复制代码
#include <stdio.h>
#define nmemb 3
struct test
{
    char name[20];
    int size;
}s[nmemb];

int main()
{
    FILE * stream;
    int i;
    stream = fopen("/tmp/fwrite", "r");
    fread(s, sizeof(struct test), nmemb, stream);
    fclose(stream);
    for(i=0; i<nmemb; i++)
        printf("name[%d]=%-20s:size[%d]=%d\n", i, s[i].name, i, s[i].size);
    return 0;
}

fclose

int fclose(FILE * stream);

说明:fclose() 用来关闭先前 fopen() 打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

返回值:若关文件动作成功则返回 0,有错误发生时则返回 EOF 并把错误代码存到 errno。

复制代码
  1 #include<stdio.h>
  2 #include<fcntl.h>
  3 
  4 
  5 int main(int argc, const char *argv[])
  6 {
  7     if (argc != 2) {
  8         printf(" %s <file>\n", argv[0]);
  9         return 1;
 10     }
 11     FILE*pf=fopen("argv[1]","w");
 12     if(pf==NULL)
 13     {
 14         perror("fopen fail\n");                                                                                                                                                  
 15         return -1;
 16     }else
 17     {
 18         printf("yes\n");
 19     }
 20     fclose(pf);
 21     return 0;
 22 }
~    
相关推荐
专注仿真8 小时前
ACM算法
算法·深度优先
YoungStudyAI9 小时前
QA的下一个自动化阶段,可能不是再写更多脚本,而是设计测试Agent
运维·自动化
分布式存储与RustFS10 小时前
纠删码到底吃掉了多少容量:EC:4、EC:8 的利用率与容错怎么算
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
遇见小修修11 小时前
3步解决打印机0x00000709报错 ,广州深圳程序员可自行排查
运维·打印机·维修·打印机报错·打印机运维·打印机故障自查
顺顺 尼11 小时前
linux 进程信号(上)
linux·c++·算法
罗西的思考11 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(5)--- GRPO
人工智能·算法·机器学习
richard_yuu11 小时前
动态规划:强化学习的「数学基础」,从 MDP 到值迭代
深度学习·神经网络·算法·yolo·机器学习·动态规划
niuTaylor11 小时前
飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
linux·服务器·人工智能·驱动开发·单片机
mmmmath_311 小时前
LeetCode.225.用队列实现栈
算法
Elaine33611 小时前
数据结构与算法-程序
数据结构·python·算法·计算机基础·编程基础