C语言文件IO函数介绍
#include <iostream>
extern "C"
{
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>
}
using namespace std;
int main(int argc, char const *argv[])
{
/*
标准输入:stdin 0
标准输出:stdout 1
标准出错:stderr 2
标准日志:stdlog
《1》ferror(FILE*)函数检查stream(流)中的错误, 如果没发生成功返回0,否则返回非零. 如果发生错误, 使用perror()检测发生什么错误.
《2》clearerr(FILE*)函数重置错误标记和给出的流的EOF指针. 当发生错误时,你可以使用perror()判断实际上发生了何种错误.
《3》如果给出的文件流是一个输出流,那么fflush()把输出到缓冲区的内容写入文件.
如果给出的文件流是输入类型的,那么fflush()会清除输入缓冲区.
fflush()在调试时很实用,特别是对于在程序中输出到屏幕前发生错误片段时.
直接调用 fflush( STDOUT )输出可以保证你的调试输出可以在正确的时间输出.
*/
//重新学文件IO
FILE*fd = fopen("test.txt","w+");
//r:只读 rb:二进制只读 r+:读写 rb+:二进制读写
//w:清空式创建文件只写 wb:创建二进制文件只写 w+:创建读写允许 wb+:新建二进制文件读写
//a:新建二进制文件存在的清空只写 ab:新建打开二进制文件只允许末尾追加写 a+:读加末尾追加写 ab+:新建二进制文件可读末尾追写
int ret =feof(fd); //当到文件尾时:返回值:成功:到达文件尾ret!=0, ,失败:没到文件尾=0
if(fd == NULL)
{
perror("文件打开失败"); //输出错误信息
return -1;
}
int isfd = fgetc(fd); //fgetc意为从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。
printf("%c\n",isfd); //获取一次后文件描述符往后移动了
isfd = fgetc(fd); //从光标位置在读,以前的后一位, 返回值:光标的下标值
printf("%c\n",isfd);
//int putc( int ch, FILE *stream );
//putc()函数把字符ch写到stream(流)中. 返回值是写入的字符, 发生错误时返回EOF.
char pp = putc('M',fd);
cout<<"pp="<< pp<<endl;
char buffer[1024]={0};
fseek(fd,0L,SEEK_END); //将文件描述符移到末尾
int end =ftell(fd); //获得文件文件中所有字符的个数,形同strlen();
cout<<"字符的个数="<<end<<endl;
//有end个字符,每次读一个,读end次
fseek(fd,0L,SEEK_SET); //设置文件描述符的偏移位置 FILE*: fd; 第二个参数:设置之后位置起始位置(long); 第三个参数:偏移的位置:SEEK_SET 开头 SEEK_CUR当前 SEEK_END结束
fread(buffer,1,end,fd); //存在buffer,第二个参数_size:每次读取字节数, _n:读取的次数, FILE*:文件指针描述符
printf("buffer= %s\n",buffer);
//end:字符的个数(X86: 数字字母:1一个字节 汉字:3个字节代表一个汉字)
fprintf(stdout,"printf\n"); //标准输出
fprintf(stderr,"error\n"); //标准出错
fprintf(stdout,"vlog\n"); //标准日志
char jb[10];
int a=10000;
sprintf(jb,"打印 %d 打印%s", a, buffer);
cout<<jb<<endl;
fseek(fd,0L,SEEK_SET); //归位
cout<<"fd ="<<fd<<endl;
// fpos_t *seek; //int fgetpos( FILE *stream, fpos_t *position );
// int yt =fgetpos(fd,seek); //fgetpos()函数保存给出的文件流(stream)的位置指针 到给出的位置变量(position)中.
// printf("%d\n", yt);
// if(yt==0)
// {
// cout<<"执行成功"<<endl;
// cout<<"seek="<<seek<<endl;
// }
// int fsetpos( FILE *stream, const fpos_t *position );
// fsetpos()函数把给出的流的位置指针移到由position对象指定的位置.
//fpos_t是在stdio.h中定义的. fsetpos()执行成功返回0,失败时返回非零.
// char *fgets( char *str, int num, FILE *stream );
// char k[20];
// fgets(k, 20, fd); //函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中.
//fgets(k, 20, stdin);
// cout<<"k="<<endl;
//函数fputc()把给出的字符ch写到给出的输出流. 返回值是字符, 发生错误时返回值是EOF.
fseek(fd,0L,SEEK_END); //尾追
int lm = fputc('A', fd); //将A写入文件 lm=65
cout<<lm<<endl;
fputc('B', fd);
fread(buffer,50,1,fd);
printf("buffer1= %s\n",buffer);
const char nnn[12]="34334545";
//fputs()函数把str(字符串)指向的字符写到给出的输出流. 成功时返回非负值, 失败时返回EOF.
fputs(nnn, fd);
fread(buffer,100,1,fd);
printf("buffe2= %s\n",buffer);
//FILE *freopen( const char *fname, const char *mode, FILE *stream );freopen()函数常用于再分配一个以存在的流给一个不同的文件和方式(mode).
// printf("该文本重定向到 stdout\n");
// FILE *fdfd =freopen("new.txt", "w+", stdout); //将输出缓冲区的内容重定向到文件 stream->stdin stdout stderr
// cout<<"我要去new.txt里面"<<endl;
// cout<<"我要去new.txt里面23333"<<endl;
//putchar()函数把ch写到STDOUT(标准输出). 代码
//putchar( ch );和 putc( ch, STDOUT );一样.
//int puts( char *str );
//函数puts()把str(字符串)写到STDOUT(标准输出)上. puts() 成功时返回非负值, 失败时返回EOF.
putchar('J');
puts("BBBBB");
fprintf(stdout, " \n\n");
//函数fscanf()以scanf()的执行方式从给出的文件流中读取数据. int fscanf( FILE *stream, const char *format, ... );
//fscanf()的返回值是事实上已赋值的变量的数,如果未进行任何分配时返回EOF.
fseek(fd, 0L , SEEK_SET);
char refd[200];
fscanf(fd,"%s",refd); //从文件读数据到数组
cout<<"refd=" << refd <<endl;
//int rename( const char *oldfname, const char *newfname );
//函数rename()更改文件oldfname的名称为newfname. rename()成功时返回0,错误时返回非零.
rename("test.txt", "newparent.html");
rename("newparent.html", "text.txt");
//函数rewind(FILE*fd)把文件指针移到由stream(流)指定的开始处, 同时清除和流相关的错误和EOF标记.
rewind(fd);
fread(buffer,100,1,fd);
printf("buffe3= %s\n",buffer);
//void setbuf( FILE *stream, char *buffer );
//setbuf()函数设置stream(流)使用buffer(缓冲区),如果buffer(缓冲区)是null,关闭缓冲. 如果使用非标准缓冲尺寸, 它应该由BUFSIZ字符决定长度.
char *vuf;
setbuf(fd,vuf); //文件的数据存储在vuf
rewind(fd);
fread(buffer,100,1,fd);
printf("vuf= %s\n",vuf);
/*
int setvbuf( FILE *stream, char *buffer, int mode, size_t size );
函数setvbuf()设置用于stream(流)的缓冲区到buffer(缓冲区),其大小为size(大小). mode(方式)可以是:
_IOFBF, 表示完全缓冲
_IOLBF, 表示线缓冲
_IONBF, 表示无缓存
*/
setvbuf(fd, vuf, _IOLBF, 20 );
rewind(fd);
fread(buffer,100,1,fd);
printf("vuf1= %s\n",vuf); // _IONBF, 表示无缓存 : 不显示结果
//int sprintf( char *buffer, const char *format, ... );
//sprintf()函数和printf()类似, 只是把输出发送到buffer(缓冲区)中.返回值是写入的字符数量.
// char *n;
// const char *l="dshjfjdhfjjfsdjfsdf";
// sprintf(n, "%s" ,l);
// cout<<"n=="<<n<<endl;
//int sscanf( const char *buffer, const char *format, ... );
//函数sscanf()和scanf()类似, 只是输入从buffer(缓冲区)中读取.
int day, year;
char weekday[20], month[20], dtm[100];
strcpy( dtm, "Saturday March 25 1989" ); //空格是一个间隔标志 从dtm按照字符本身的格式获取你想要的值
sscanf( dtm, "%s %s %d %d", weekday, month, &day, &year );
printf("%s %d, %d = %s\n", month, day, year, weekday );
cout<<fd->_file; //3 其他文件流下表是3开始
//int remove( const char *fname );
//remove()函数删除由fname(文件名)指定的文件. remove()成功时返回0,如果发生错误返回非零.
getchar();
//remove("new.txt"); //用于删除文件 参数:文件的绝对路径
//关闭文件
fclose(fd);
return 0;
}
输出:
PS C:\Users\Administrator\Desktop\C语言函数集合> g++ .\标准C中IO.cpp
PS C:\Users\Administrator\Desktop\C语言函数集合> ./a
□
□
pp=M
字符的个数=1
buffer= M
printf
error
vlog
打印 10000 打印00
fd =0x800073928
65
buffer1= 00 打印00
buffe2= 00 打印00
JBBBBB
refd=MAB34334545
buffe3= MAB343345450
vuf= MAB34334545□
vuf1= MAB34334545□
March 25, 1989 = Saturday
3