一、linux操作命令
【wc】:指定字符统计;
【file 文件名】:可以查看文件的类型;
二、写入函数【fwrite】————可写入二进制文件
形式:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
【const void *ptr】:变量名(或者结构体名);
【 size_t size】:该内容一个多大(或者结构体);
【size_t nmemb】:份数,总共有几个;
【FILE *stream】:需要操作的文件名;
注意:该函数的返回值为对向数,size_t nmemb成功的数,为整型;
eg:
三、读取函数【fread】————可读取二进制文件
形式:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
【void *ptr】:接收变量的内存空间,需要定义一个;
【 size_t size】:读取内容所需一个的大小(或者结构体);
【size_t nmemb】:份数,总共有几个(可以比实际大);
【FILE *stream】:需要操作的文件名;
注意:该函数的返回值为对向数,size_t nmemb成功的数,为整型;
读取可以比实际大,但是写入的时候不能比实际大,否则多出的空间会进行补全
eg:
eg:(1)用fread和fwrite实现拷贝:
//用malloc申请空间去实现拷贝
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE* src = fopen("2.png","r");
FILE* dst = fopen("3.png","w");
if(NULL == src||NULL == dst)
{
fprintf(stderr,"fopen error\n");
return 1;
}
int size = 160743;
char *data =(char*)malloc(size);
size_t ret = fread(data,size,1,src);
if(1 == ret)
{
fwrite(data,size,1,dst);
}
fclose(dst);
fclose(src);
free(data);
return 0;
}
标准文件定位
一、fseek
形式:
int fseek(FILE *stream, long offset, int whence);
【FILE *stream】:需要操作的文件;
【long offset,】:偏移量,可正可负;
【int whence】:输入指定宏,开头,结尾;【SEEK_SET】开头(偏移量可负,若正则扩展,后面补0);【SEEK_END】结尾:【SEEK_SET】:通常指向上次操作的位置;
返回值为0时,偏移成功,返回值为-1,则表示出错;
二、 long ftell( )
形式:
long ftell(FILE *stream);
返回值为当前的偏移量;可以用来确认文件的大小;
eg:
三、rewind()
形式
void rewind(FILE *stream);
将文件流指针指向开始;
(1)用read和write实现文件的拷贝
程序:
四、缓冲区
1、行缓冲区
大小一般为1k,主要用于人机交互stdout
缓存区满或者遇到\n刷新 1024
行缓存多是关于终端的一些操作
1.遇到\n刷新
2.缓存区满刷新
3.程序结束刷新
4.fflush刷新 fflush(stdout); FILE*fp stdin stdout stderr
eg:
2、全缓冲
缓冲区大小一般4k,主要用于文件的读写
缓存区满刷新缓存区 4096
对普通文件进行标准IO操作,建立
的缓存一般为全缓存
刷新条件:
1.缓存区满刷新
2.程序结束刷新
3.fflush来刷新 fflush(fp);
eg:
3、无缓冲
主要用于出错处理信息的输出 stderr
不对数据缓存直接刷新
printf();==>>stdout
fprintf(strerr,"fopen error %s",filename);
界面交互 出错处理
使用gdb查看,FILE结构体,或使用写入数据测试缓冲区。
缓冲区的大小是可以设置
eg:
五、文件oi
操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用 其中文件IO,一般都是对设备文件操作,当然也可以对普通文件进行操作。
文件oi:一个基于Linux内核的没有缓存的IO机制;
特性:
.1 没有缓存区
.2 操作对象不在是流,而是文件描述符
.3文件描述符
很小的非负的整数 int 0-1023
内核每打开一个文件就会获得一个文件 描述符
每个程序在启动的时候操作系统默认为其打开
三个描述符与流对象匹配:
0 ==>STDIN_FILENO === stdin
1 ==>STDOUT_FILENO == stdout
2 ==>STDERR_FILENO == stderr
stdin,stdout,stderr,===>FILE*
1、open
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
【const char *pathname】:操作的文件名;
【int flags】标志位输入宏【O_RDONLY】只读, 【O_WRONLY,】只写 、【O_RDWR.】读写;
【O_APPEND】追加;接之前的文件写入;
【 O_CREAT】创建,第一次创建必须有;
【O_TRUNC】清空;
若要写多个flags:则O_WRONLY|O_CREAT|O_TRUNC,中间用逻辑‘或’ '|' 进行分隔;
【mode_t mode】指定文件的权限;
mode(权限):
引入:-rw-rw-r-- 一共十个,分成1和9来看
r-- -w- --x
100 010 001
4 2 1
用八进制表示为0421
一般文件权限给0666
当有O_CREATE时,给权限0666;若不给则会随机在栈上抓取一个变量用于权限
umask:掩码默认为002,与0666相减即可得0664
创建目录时用0777;
eg:
2、write
形式:
ssize_t write(int fd, const void *buf, size_t count);
【int fd】 :写入的目的地;
【const void *buf】:写的内容指向的指针;
【size_t count】:长度,写有效长度;
该函数的返回值为带符号的整数;
若成功,则返回值为写入的字节数
若失败,则返回值-1;
3、关闭close
形式:
int close(int fd);
4、read
形式
ssize_t read(int fd, void *buf, size_t count);
【int fd】:需要读取的文件
【void *buf】:读取的文件放在哪里:
【 size_t count】:读取文件的大小;(读取时可以比实际大)
返回值:成功返回值为读到的字节数,
返回值为0,代表文件读取完成;
失败时返回值为-1;
文本文件fgets、fputs
二进制文件read、write