嵌入式学习的第二十四天-系统编程-文件相关函数-标准IO

一、文件

1.标准io:stdio.h

(1)标准io的概念 1975 Dennis r IO库,C语言的标准,ANSI c 

        IO :input  output

        I: 键盘是标准输入设备 ====》默认输入就是指键盘  /dev/input

        O: 显示器是标准输出设备 ==》默认输出就是指显示器

(2)Linux操作系统当中IO都是对文件的操作

         C一部分,任何支持标准C的系统都可使用标准IO实现文件存储

        标准IO在UNIX上是对文件IO的封装

        一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,加入缓冲区,可以

有效减少系统调用的效率,节省系统IO调度资源。

2.文件的概念,作用

        linux中一切都是文件。文件用来存储数据(数据,指令);

3.文件的类型
4.io的分类

(1)标准io

        ANSI C 设计的一组用文件IO 封装的操作库函数

(2)stdio.h

        头文件: stdio.h  ==》标准输入输出头文件

         /usr/include/stdio.h

         <>   是系统库函数,默认路径在/usr/include/

(3)Dennis Ritchie

        man  man  ==>所有man的帮助

        man  xxx == man 1 xxx ===>查看当前xxx命令

        man 2 xxx  ===>查看xxx对应的系统调用函数

        man 3 xxx  ===》查看xxx对应的标准库函数

:如果没有命令则直接man xxx 会显示其函数\n ;如果没有系统调用则显示系统库函数帮助

4.文件内容的分类
  •  文本文件 可见字符  \n
  • 二进制文件     
5.流

(1)流的定义

        FILE*:数据从文件当中流入和流出所体现出来的字节

(2)流的分类

  • 二进制流: 2001 \n   二进制数据的流
  • 文本流: ASCII码数据的流 \n \t 
  • FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针。

     流对象 ===》头 《===数据====》尾

6.文件操作的步骤

(1)打开->> FILE * fp 

(2)读写

  • fgetc/fputc,,,,,,一个字符,任何文件都能处理
  • fgetc(int c ,FILE*strem);
  • fgets/fputs....,,一次一行,适合操作文本文件
  • fread/fwrite....自定义大小,,二进制

(3)关闭

7.mode文件权限

  • r 只读 文件不存在报错  文件存在则只读打开
  • r+ 读写 文件不存在报错 文件存在则读写打开
  • w 只写 文件不存在则创建 文件存在则清0只写打开
  • w+ 写 文件不存在则创建 文件存在则清0写读打开 

二、相关函数

(1)fopen 

#include<stdio.h>

 int main(int argc, char **argv)
{
    FILE*fp = fopen("1.txt", "w");//w会将文件清零
    if(NULL == fp)
    {
        fprintf(stderr, "fopen");
        return 1;
    }

    
    fputc('h',fp);
    fputc('e',fp);
    fputc('l',fp);
    fputc('l',fp);
    fputc('o',fp);

    fclose(fp);
    return 0;
}

:w会将文件清空  ; FILE*不代表文件内容,它里面有个成员,可以指向文件  ; ll 查看新建文件是否有写入东西;cat 查看文本文件内容;od -c查看二进制文件 ;od -t  x1 转为十六进制查看

(2)fgetc

int fgetc(FILE *stream);

功能:从流中读取一个字符

参数:stream:文件流指针

返回值:成功返回读到字符的ASCII码值;读到文件末尾返回EOF;失败返回EOF -1
c= fgetc(stdin);
fputc(c,stdout);
获取键盘上面的输入,显示到屏幕。

#include<stdio.h>

int main(int argc, char **argv)
{
    FILE*fp=fopen("1.txt", "r");
    if(NULL == fp)
    {
        fprintf(stderr, "fopen error\n");
        return 1;
    }
    while(1)
    {
        int c=fgetc(fp);
        if(EOF == c)
        {
            break;
        }
        printf("%c",c);
    }
    fclose(fp);
    
    return 0;
}

(3)cp_fetc

#include <stdio.h>
// ./a.out srcfile1 dstfile2
int main(int argc, char** argv)
{
  FILE* src = fopen(argv[1], "r");
  FILE* dst = fopen(argv[2], "w"); 
  if (NULL == src || NULL == dst)
    {
      fprintf(stderr, "fopen error\n");
      return 1;
    }

  while (1)
    {
      int c = fgetc(src);
      if(EOF == c)
      {
        break;
      }
      fputc(c, dst);
    }

    fclose(dst);
    fclose(src);
  
  return 0;
}

(4)main_argc

#include <stdio.h>

int	main(int argc, char *  argv[])
{
    
    printf("argc is %d\n",argc);

    int i = 0 ;
    for(i=0;i<argc;i++)
    {
        printf("%s\n",argv[i]);
    }
    return 0;
}

(5)cp_argc

#include <stdio.h>

int main(int argc, char** argv)
{
  if (argc < 3)
    {
      fprintf(stderr, "usage:./a.out srcfile dstfile\n");
      return 1;
    }
  FILE* src = fopen(argv[1], "r");  
  FILE* dst = fopen(argv[2], "w");  

  if (NULL == src || NULL == dst)
    {
      fprintf(stderr, "fopen error\n");
      return 1;
    }

  while (1)
    {
      int c = fgetc(src);
      if (EOF == c)
        {
          break;
        }
      fputc(c, dst);
    }

  fclose(dst);
  fclose(src);

  return 0;
}

(6)fgets:按行获取数据

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

功能:从stream流对象关联的文件中获取size大小字节的文本数据并存储到s对应的本地内存(栈区

        数组,堆区内存).

参数:s 要存储数据的本地内存;size 要获取的数据长度,单位字节。stream 要获取的目标文件流

           对象,可以是stdin ,程序会阻塞等待如果是普通文件fp 则指向文件第一行数据

返回值:成功 返回指向有效数据的首地址,一般等于s的地址
                失败 或者 文件末尾 NULL;

#include <stdio.h>

int	main(int argc, char **argv)
{
    if (argc < 2)
    {
      fprintf(stderr, "usage:./a.out filename\n");
      return 1;
    }
    FILE*fp = fopen(argv[1], "r");
    if(NULL==fp)
    {
        fprintf(stderr, "fopen error\n");
        return 1;
    }

    while(1)
    {
        char buf[1024]={0};
        if(NULL== fgets(buf,sizeof(buf),fp))
        {
            break;
        }
        printf("%s",buf);
    }

    fclose(fp);
    return 0;
}

(7)fputs:按行获取数据

#include <stdio.h>

int	main(int argc, char **argv)
{
    FILE*fp=fopen("3.txt", "w");
    if(NULL==fp)
    {
        fprintf(stderr, "fopen error\n");
        return 1;
    }

    char buf[] = "world";
    char str[] = "aaabbb";
    fputs("hello",fp);
    fputs(buf, fp);
    fputs(str+3, fp);

    fclose(fp);
    return 0;
}

(8)cp_fgets

#include <stdio.h>

int main(int argc, char** argv)
{
  if (argc < 3)
    {
      fprintf(stderr, "usage:./a.out srcname  dstname\n");
      return 1;
    }
  FILE* src = fopen(argv[1], "r");
  FILE* dst = fopen(argv[2], "w");
  if (NULL == src || NULL == dst)
    {
      fprintf(stderr, "fopen error\n");
      return 1;
    }

  while (1)
    {
      char buf[1024] = {0};
      if (NULL == fgets(buf, sizeof(buf), src))
        {
          break;
        }
      fputs(buf, dst);
    }
  fclose(dst);
  fclose(src);

  return 0;
}

(9)统计文本文件中a-z,出现的次数,并输出。 /etc/passwd

#include <stdio.h>

int	main(int argc, char **argv)
{
    FILE*fp = fopen("/etc/passwd", "r");
    if(NULL == fp)
    {
        fprintf(stderr, "fopen error\n");
        return 1;
    }
    int counter=0;
    char buf[1024]={0};
    while(1)
    {
        if(NULL== fgets(buf,sizeof(buf),fp))
        {
            break;
        }
        if('\n' !=buf[strlen(buf)-1])
        {
             counter++;
        }   
    }
    printf("counter = %d\n",counter);
    fclose(fp);
    return 0;
}

注:wc-l /etc/passwd 小命令用来统计行号

(10)统计文本文件的行数,并输出

#include <stdio.h>

int	main(int argc, char **argv)
{
    FILE*fp = fopen("/etc/passwd", "r");
    if(NULL == fp)
    {
        fprintf(stderr, "fopen error\n");
        return 1;
    }
//方法一:
   int a[26] = {0};
   while (1)
    {
        int c = fgetc(fp);
        if(EOF == c)
        {
            break;
        }
        if(c>='a'&&c<='z')
        {
            a[c-'a']++;
        }
    }

    int i = 0;
    for(i=0;i<26;++i)
    {
        printf("%c : %d\n",i+'a',a[i]);
    }
    fclose(fp);
//方法二:
    // for(char i ='a';i<='z';++i)
    // {
    //     int counter=0;
    //     FILE*fp = fopen("/etc/passwd", "r");
    //     while(1)
    //     {
    //         char c=fgetc(fp);
    //         if(EOF == c)
    //         {
    //             break;
    //         }
    //         if(c==i) 
    //         {
    //             counter++;
    //         }
    //     }
    //     printf("%c : %d  \n",i ,counter); 
    //     fclose(fp);
    // }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值