文件编程--标准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 }
~    
相关推荐
GeW3 小时前
新质生产力路线图Linux、数据库、国产化替代一次讲透
linux
zyl7655 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
aningx5 小时前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位7 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
骑着蜗牛撵大象3278 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
爱读书的小胖9 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌9 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
众壹新能源科技9 小时前
逆变器自带无功不够用,加装5MVar SVG后功率因数从0.85回到0.99
运维·人工智能·自动化
..Dauntless..9 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
QMCY_jason9 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器