文件编程--标准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 }
~    
相关推荐
梦想的旅途21 小时前
企业微信SCRM怎么对接API?私域自动化常用接口清单
运维·自动化·企业微信
青 春 记 忆1 小时前
LeetCode 121. 买卖股票的最佳时机|Python 解法详解
python·算法·leetcode
stolentime1 小时前
AT_agc066_a [AGC066A] Adjacent Difference题解
c++·算法·贪心算法·构造
渣波1 小时前
深度解析:LeetCode 51. N 皇后 —— 回溯算法的巅峰之作
算法
咪饭只吃一小碗1 小时前
# C++ STL 常用容器方法全面总结vector / map / set / unordered_map / unordered_set
算法
旗开得胜马到成功2 小时前
AMD TPM 8.3/8.5漏洞技术剖析:服务器加密信任根崩塌后的备份密钥泄露风险与紧急加固
运维·服务器·网络·系统架构
daad7772 小时前
802.11 前导码与 STF 深度解析(含检测算法与 5G 对比
人工智能·算法·5g·wifi·802.11·前导码
我是小灰灰吖2 小时前
解决高频率图像处理中的内存“只增不减”:glibc malloc_trim实战指南
linux·qt
小嵌同学2 小时前
Linux 内核中断处理机制详解:上半部、下半部与延迟执行策略
linux·嵌入式·bsp