Linux系统编程(标准io)

标准io

linux中文件的类型 ,7 种

cpp 复制代码
使用ll 命令 ,中第一列的字母 ,代表不同的文件类型
drwxrwxr-x 10 linux linux 4.0K Sep 6 2021 .vimplus/
lrwxrwxrwx 1 linux linux 27 Sep 5 2021 .vimrc ->
/home/linux/.vimplus/.vimrc
-rw-rw-r-- 1 linux linux 3.4K Sep 22 11:28 .vimrc.custom.config
d 目录 使用cd进入
l 软链接文件 类型win 中的快捷方式
- 一般文件 电影,照片,1.c a.out
ll /dev 设备目录
crw------- 1 root root 249, 0 Nov 27 17:06 rtc0
brw-rw---- 1 root disk 8, 0 Nov 27 17:06 sda
c 字符设备 数量小,有顺序 绝大多少的设备都是这种
b 块设备 存储设备 , u盘,光盘,硬盘 。512字节,随机访问。
s 套接字文件 和网络相关的文件
p 管道文件 和进程相关
命令行参数
// ./a.out 1 2 3 4 5 6
//argc 命令行参数的个数
//argv 命令行参数的内容
int main(int argc, char *argv[])
{
printf("argc is %d\n",argc);
int i = 0 ;

系统编程,会学习到大量的函数(有linux系统提供函数)

man man ->所有man的帮助

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

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

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

命令行参数

cpp 复制代码
命令行参数
// ./a.out 1 2 3 4 5 6
//argc 命令行参数的个数
//argv 命令行参数的内容
int main(int argc, char *argv[])
{
printf("argc is %d\n",argc);
int i = 0 ;
for(i = 0 ;i<argc;i++)
{
printf("%d %s\n",i,argv[i]);
}
return 0;
}

文件操作;

1.打开文件 fopen

cpp 复制代码
FILE *fopen(const char *pathname, const char *mode);
pathname //,需要被操作的目录+文件名
mode //操作的模式
//返回值:返回一个FILE结构体 (系统定义的,包含文件相关的属性, pos对写位置)
//一次写入一个字符
int fputc(int c, FILE *stream);
//c 需要写入文件的字符 ,
stream //,需要写入数据的文件流指针

|------|---------------------------------|--------------|
| mode | 说明 | 注意 |
| r | 只读方式打开文件,起始位置在文件的开头 | 目标文件必须存在 |
| r+ | 以读写方式打开文件,起始位置在文件的开头 | 目标文件必须存在 |
| w | 只写方式打开文件,起始位置在文件的开头 | 会创建文件,并清空 文件 |
| w+ | 以读写方式打开文件,起始位置在文件的开头 | 会创建文件,并清空 文件 |
| a | 以追加写方式打开文件,起始位置在文件的最后 | 会创建文件 |
| a+ | 以追加写,或读方式打开文件,起始位置在文件的写最后, 读在开头 | 会创建文件 |

2.读写文件

|--------|-------------------------------|----------|
| 函数 | 说明 | 注意 |
| fgetc | 一个字符一个字符读取文件,到达结尾返回EOF | 文本文件/bin |
| fputc | 一个字符一个字符写入文件,写入EOF | 文本文件/bin |
| fgets | 一次读取一行.到达结尾返回NULL ,注意size的选择。 | 文本文件 |
| fputs | 一次写入一个字符串。 | 文本文件 |
| fread | 自定义大小读文件 | 文本文件/bin |
| fwrite | 自定义大小写文件 | 文本文件/bin |

cpp 复制代码
一次写入一个字符
int fputc(int c, FILE *stream);
c 需要写入文件的字符 ,
stream ,需要写入数据的文件流指针
返回值 EOF 失败 成功返回写入的字符
一次读入一个字符
int fgetc(FILE *stream);
stream ,需要读数据的文件流指针
返回值 EOF 失败或文件到达结尾 成功返回读到的字符
一次写入一个字符串
int fputs(const char *s, FILE *stream);
s,表示需要写入文件的字符串
stream ,需要写入数据的文件流指针
返回,>0 表示成功。 EOF 失败
char *fgets(char *s, int size, FILE *stream);
s,表示一个字符数组,需要开辟内存空间。
size ,表示本次最多读多少个字符。可以比内容的大
stream ,需要读数据的文件流指针
返回值: 成功返回指向s的指针 NULL 失败或文件到达结尾

3.关闭文件 fclose

cpp 复制代码
int fclose(FILE *stream);
stream ,需要操作的文件流指针。 因为fopen的时候,会向系统申请资源。fclose 是释放资源。

系统给a.out 打开的3个FILE * ,流指针

|-----------------|----------------|--------------------------------|
| 流指针 | 说明 | 使用 |
| stdin(FILE*) | 标准输入,默认从键盘接收数据 | fgets(s,sizeof(s),stdin); |
| stdout (FILE*) | 标准输出,默认输出到屏幕 | puts(s,stdout); |
| stderr(FILE*) | 标准错误输出,默认输出到屏幕 | printf(stderr,"xxx error\n"); |

标准io 相关函数都是带有缓存区的,主要关注输出方向

cpp 复制代码
行缓冲,1k, terminal,主要用于人机交互stdout
缓存区满或者遇到\n刷新 1024
行缓存多是关于终端的一些操作
1.遇到\n刷新
2.缓存区满刷新
3.程序结束刷新
4.fflush刷新 fflush(stdout); FILE*fp stdin stdout stderr
全缓冲,4k,主要用于文件的读写
缓存区满刷新缓存区 4096
对普通文件进行标准IO操作,建立
的缓存一般为全缓存
刷新条件:
1.缓存区满刷新
2.程序结束刷新
3.fflush来刷新 fflush(fp);
无缓冲,0k 主要用于出错处理信息的输出 stderr
不对数据缓存直接刷新。

标准IO之文件定位:

|--------|------------------------|-------------------------|
| 函数 | 功能 | 使用 |
| fseek | 偏移读写指针 | fseek(fp,0,SEEK_SET); |
| ftell | 返回从文件到当前读写指针位置的偏移量 ,单i | int offset = ftell(fp); |
| rewind | 偏移读写指针到文件的开头 | rewind(fp); |

cpp 复制代码
int fseek(FILE *stream, long offset, int whence);
功能:将stream流文件中的文件指针从whence位置开始
偏移offset字节的长度。
参数:stream 要移动文件指针的目标文件流对象。
注意:不支持设备文件,一般用于普通文件。
offset 要在文件内偏移的距离,单位字节。
如果值为整数,则向文件末尾偏移
如果值为负数,则向文件开头偏移
whence 偏移的起始位置,由系统定义的三个宏开始。
SEEK_SET 文件的开头位置
SEEK_CUR 文件的当前位置
SEEK_END 文件的末尾位置
返回值:
成功: 返回 0
失败: -1;
long ftell(FILE *stream);
功能:获取当前文件流指针的具体位置,一般以文件
开头到当前指针的字节数为返回值。
参数:stream 要返回指针距离的文件流对象
返回值:成功 获取到的距离长度,单位是字节
失败 -1;
void rewind(FILE* stream);
功能:复位文件流读写指针到开头
参数:stream 需要操作的文件流对象
相关推荐
Boilermaker19928 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
MM_MS8 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
C_心欲无痕8 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
꧁Q༒ོγ꧂9 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs9 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_999 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
冰西瓜6009 小时前
国科大2025操作系统高级教程期末回忆版
linux
古城小栈9 小时前
Rust 迭代器产出的引用层数——分水岭
开发语言·rust
ghie909010 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体110 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit