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;
}
相关推荐
wefly201714 小时前
无需安装、开箱即用!m3u8live.cn 在线 HLS 播放器,调试直播流效率翻倍
前端·后端·python·前端开发工具·后端开发工具
Jinkxs14 小时前
Java 部署:Jenkins Pipeline 构建 Java 项目(自动化)
java·spring boot
UXbot14 小时前
为什么 AI 正在重新定义 UI 设计工具的入门门槛
前端·人工智能·低代码·ui·交互·ai编程·ux
celeste031014 小时前
Redis Summary
linux·运维·服务器·redis·笔记
Jinkxs14 小时前
Java 部署:滚动更新(K8s RollingUpdate 策略)
java·开发语言·kubernetes
a8a30214 小时前
Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
java·spring boot·logback
jfqqqqq14 小时前
win11下intelliJ idea的shift + F6无效
java·ide·intellij-idea
xu_ws14 小时前
Spring-ai项目-deepseek-7-Function Calling(智能客服)
java·人工智能·spring
柳杉14 小时前
两款惊艳的 WebGL 开源项目推荐
前端·javascript·数据可视化
给算法爸爸上香14 小时前
web网页显示点云
前端·3d·web·点云