Linux文件编程:流与操作全解析

文件编程:

用户角度:

流,stream;

编程角度:

  1. 打开文件。

  2. 读/写。(判断)

3,关闭。

Linux系统的结构

Linux系统对于文件? 设计

思想:

一切皆文件!file'

函数 打开:

man手册的使用

名字-摘要-描述-返回值;

函数 删除:

返回值:

FILE * //流指针 文件指针 代表打开了的某个文件

成功 FILE * 流指针

失败 NULL & errno 会被设置

void perror(const char *s);

功能:

可以根据errno打印对应的错误信息

打印效果:

perror("自定义的信息");

自定义信息:错误原因

会指出错误的原因:

示例:

bash 复制代码
#include<stdio.h>
int main()
{
    FILE*fp = fopen ("txt.c","r");
//
打开的方式:

 r  只读

 r+  读和写

 w  文件存在截断成0,不存在创建一个新的文件。

 w+  读写

 a   在文件末尾出写
    注意 文件存在在末尾追加的写,不存在则创建

 a+   读写
    if(NULL == fp)
    {/*
        printf("error\n");
        */
     perror("fopen fail"); 
        return 1;
    }
    printf("success\n");
    return 0;
}

关闭 文件:

实际上是个宏 相当于-1;

bash 复制代码
#include <stdio.h>
// 处理命令行参数  ./a.out    txt.c  2个参数
int main(int argc, const char* argv[])
{
  if (argc != 2)
  {
    printf("Usage : %s <filename>\n", argv[0]);
    return -1;
  }
  // open the file
  FILE* fp = fopen("txt.c", "w");
  if (NULL == fp)
  { /*
       printf("error\n");
       */
    perror("fopen fail");
    return 1;
  }
  printf("success\n");
  fclose(fp); // 函数
  return 0;
}

标准输入:

bash 复制代码
#include <stdio.h>
int main(int argc, char **argv)
{
  int ret = fgetc(stdin); // 从键盘上面输入
  printf("ret = %c:%d\n", ret, ret);



// 连续输出
  int ret =0;
  while((ret = fgetc(stdin))  != EOF) // 返回值是int类型;
{
   printf("ret = %c:%d\n", ret, ret);
}
// 运行后ctrl + d 结束
  return 0;
}

运行结果
a
ret = a:97
ret =   //包含回车 
:10
c
ret = c:99
ret = 
:10
d
ret = d:100
ret = 
:10

cat 显示函数练习:

bash 复制代码
#include <stdio.h>
int main(int argc, char **argv)
{
  if (argc != 2)
  {
    printf("Usage : %s <filename>\n", argv[0]); 给出用户解释输入方式
    return -1;
  }
打开  fopen
读写  printf
关闭  
  FILE *fp = fopen(argv[1], "r"); // 读./a.out (file) // 打开文件
  int ret = 0;
  while ((ret = fgetc(fp)) != EOF)  // 利用指针读取文件
  {
    printf("%c", ret);
  }
  fclose(fp);
  return 0;
}

标准输出:

bash 复制代码
 int ret = 0;
  while ((ret = fgetc(stdin)) != EOF)  
  {
    //  printf("%c", ret);
    fputc(ret, stdout);  代替printf
  }

  return 0;
}

练习;cp shuru.c txt2.c 复制源文件到目标文件中。

bash 复制代码
#include <stdio.h>
int main(int argc, char **argv)
{
  if (argc != 3)
  {
    printf("Usage : %s <filename>  <filename>\n", argv[0]);
    return -1;
  }
  FILE *fp_s = fopen(argv[1], "r");  // 代表打开文件
  FILE *fp_d = fopen(argv[2], "w");  
if(fp_s == NULL || fp_d == NULL)
{
  perror("fail name");
  return -1;
}

  int ret = 0;
  int ret1 = 0;
  while ((ret = fgetc(fp_s)) != EOF)
  {
    fputc(ret, fp_d);  // 输出过程是把读取的ret 写入fp_d 中。
  }
  fclose(fp_s);
  fclose(fp_d);
  return 0;
}
diff 1.c 2.c 判断是否一样
vi  1.c 2.c -d
bash 复制代码
#include <stdio.h>
int main(int argc, char **argv)
{
  char a[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  fgets(a, sizeof(a), stdin);
  for (int i = 0; i < 10; i++)
  {
    printf("a[%d] = %c : %d\n", i, a[i], a[i]);
  }
  return 0;
}
输入hello后的 输出结果
hello
a[0] = h : 104
a[1] = e : 101
a[2] = l : 108
a[3] = l : 108
a[4] = o : 111  // 包含回车的输入
a[5] = 
 : 10
a[6] =  : 0  // '\0'结尾
a[7] =  : 1
a[8] =  : 1
a[9] =  : 1

读取终止条件的判断:

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

字符串读取。

练习 用 fgets 实现 cat (显示代码)功能:

复制代码
#include <stdio.h>
int main(int argc, char **argv)
{
  if (argc != 2)
  {
    printf("Usage : %s <filename>\n", argv[0]);
    return -1;
  }
  FILE *fp = fopen(argv[1], "r");  //打开文件和以什么方式
  char a[5] = {0}; // 用字符串,每次最多读取4个字符
  char *ret = NULL;  // 用于接收fgets的返回值
  while (1)
  {
    if ((ret = fgets(a, sizeof(a), fp)) == NULL)   //读取文件,判断返回值是否为空
    {
      break;
    }
    printf("%s", a); // 不断输出字符串
  }
  fclose(fp); //关闭文件
  return 0;
}
相关推荐
Csvn10 分钟前
构建工具
前端
vibecode23 分钟前
网站服务器失去响应怎么解决?我把连接超时和读超时这两段计时拆开跑了一遍
运维·服务器
FRing0340 分钟前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
迪康Defender2 小时前
终端供应链安全:应用白名单与软件正版化检测落地|终端安全治理实践
运维·服务器·网络·安全·web安全·自动化·运维开发
沫璃染墨3 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
kyriewen3 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
海的透彻3 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
IT_陈寒3 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
code2cat3 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
工控丫丫4 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库