linux软件编程-IO
函数接口
1.fputs()
fputs
int fputs(const char *s, FILE *stream);
功能:
向流中写入一行字符串
参数: s
要写的信息,一般是固定的字符串或者有数据的数组。
stream
要写入的目标文件流对象返回值:如果操作成功,函数返回一个非负值;如果发生错误,则返回EOF1
即 -1;
注:
不写入 '\0'
puts和fputs的区别:
1.fputs不会自动增减\n
2.puts 会多打印\n字符
2.fgets()
fgets
//按行读写 按字符串读写
fgets -- char ---> string
fputs -- char ---> stringchar *fgets(char *s, int size, FILE *stream);
功能:
从stream流对象关联的文件中获取size大小字节的文本数据
并存储到s对应的本地内存(栈区数组,堆区内存)
参数:1. s 要存储数据的本地内存(栈,堆)
2. size 要获取的数据长度,单位字节。
3. stream 要获取的目标文件流对象,可以是stdin ,程序会阻塞等待;
如果是普通文件fp 则指向文件第一行数据
返回值:成功 返回指向有效数据的首地址,一般等于s的地址
失败 或者 文件末尾 NULL;注意:
1.fgets能读取一行就读取一行
2.fgets会读到n个数据,如果n个数据中存在\n字符则立即停止当
前的读取操作,如果没有\n,则读取n-1个字符,最后一个存储\0
3.fgets每行读取的数据后面都有一个\n,在\n后面存放一个\0
12345
buf[] = '1''2''3''4''5''\n''0'4.gets是危险的,因为没有规范读到数据的上限
5.gets会去掉从终端读入的\n字符 //也读走了\n 但是将 \n 去掉了 \n --> '\0puts和fputs的区别:
1.fputs不会自动增减\n
2.puts 会多打印\n字符
二进制文件读写: fread()/fwrite()
1.fread()
读
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr
所在的本地内存中。
参数:
ptr 要存储数据的本地内存一般是数组或者结构体指针
size 单个数据块的元数据大小。最小单元的大小
nmemb 要获取的数据块的个数,拷贝的数据块个数。
stream 要获取数据的源文件流对象,如果是stdin表示从
键盘获取数据,如果是fp文件则表示从普通文件获取。
返回值:
成功 小于等于nemeb的整数,表示获取的数据长度
失败 小于0,结尾 0;
2.fwrite()
写:
size_t fwrite(const void *ptr, size_t size,size_t nmemb, FILE *stream);
功能:
从ptr所在本地内存中取出nmemb个大小为size的数据块写入到stream流对应
的文件流对象中。
参数:ptr 要写的数据块地址,一般是数组或者结构体指针
size 要写的数据块元数据大小,单位是字节
nmemb 要写的数据块的个数
stream 要写的目标文件流对象。如果是stdout则表示数据会
写到终端屏幕显示,如果是fp的普通文件则会写入到文件中。返回值:
成功 小于等于nmemb 的个数。
失败 <0
定位操作:标准IO之文件定位函数:fseek ,ftell ,rewind
1.fseek()
fseek
int fseek(FILE *stream, long offset, int whence);//long -->signed long
功能:
将stream流文件中的文件指针
从whence位置开始
偏移offset字节的长度。
参数:
stream 要移动文件指针的目标文件流对象。
注意:不支持设备文件,一般用于普通文件。
offset
要在文件内偏移的距离,单位字节。
如果值为整数,则向文件末尾偏移
如果值为负数,则向文件开头偏移
whence 偏移的起始位置,由系统定义的三个宏开始。
SEEK_SET 文件的开头位置 offset 只能是正值
SEEK_CUR 文件的当前位置 offset 可正可负, 但是如果当前位置与 SEEK_SET重合 offset 不能是负的
SEEK_END 文件的末尾位置 offset 可正 可负
正 --- 空洞文件
返回值:
成功: 返回 0
失败: -1;
fseek(fp,100,SEEK_SET); //从头开始往后偏移100个字节
2.ftell()
ftell
long ftell(FILE *stream);
功能:获取文件位置指示器的偏移量
参数:求偏移量的文件流指针
返回值:文件位置指示器到文件开头的偏移字节数
3.rewind()
rewind(fp);
void rewind(FILE *stream)
功能:
获取当前文件流指针的具体位置,
一般以文件开头到当前指针的字节数为返回值
参数:stream 要返回指针距离的文件流对象
返回值:void
rewind() 等效于:
fseek(stream,0L,SEEK_SET);
缓冲区
#include<stdio.h>
#include<unistd.h>
int main(int argc, char const *argv[])
{
FILE *p=fopen("1.txt","w");
#if 0
fputs("hello\n",p);//在缓冲区里
while (1);
#endif
#if 1
for(int i=0;i<4096;i++)//缓冲区满则刷新
{
fputc('a',p);
}
sleep(3);
fputc('a',p);//
while(1);
#endif
#if 0
fputs("hello",p);
fflush(p);//刷新缓冲区
while(1);
#endif
return 0;
}
行缓冲,1k,terminal,主要用于人机交互stdout
缓存区满或者遇到\n刷新 1024
行缓存多是关于终端的一些操作
1.遇到\刷新
2.缓存区满刷新
3.程序结束刷新
4.fflush刷新 fflush(stdout); FlLE*fp stdin stdout stderr
全缓冲,4k,主要用于文件的读写
缓存区满刷新缓存区 4096
对普通文件进行标准I0操作,建立的缓存一般为全缓存
刷新条件:
1.缓存区满刷新
2.程序结束刷新
3.fflush来刷新 fflush(fp);
无缓冲,0k主要用于出错处理信息的输出 stderr不对数据缓存直接刷新
printf();==>>stdoutfprintf(strerr,"fopen error %s",filename);界面交互 出错丛理使用qdb查看,FILE结构体,或使用写入数据测试缓冲区。缓冲区的大小是可以设置