-
如何打开文件流,如何将字符数组的内容格式发写入文件流,如何将数据写入文件流;如何将文件流读指定数据出来,如何从文件流中读一个字符出来.如何将文件流全部推入文件;如何关闭文件流
-
如果触发了错误,错误变量error被设置了,如何清除error,使用什么函数
-
如何判断文件流是否读完;如何记录文件流的位置
-
如何用键盘将一个字符数据写入文件流
-
如何用键盘将字符串数据写入文件流
-
如何设置一个监控,随时监控对文件的操作没有错误
-
stdio主要是文件操作,输入输出操作
-
在对文件流进行写入操作时,由于写入需要时间,又不知道都写进去没,如何确保全部都写进去了
-
如何查看现在所处的文件流的位置
-
如何自己选中文件流的某个位置
-
如何自己选中文件流的位置与确定文件流的方向
-
如何得到文件流开始到文件流当前所定位位置处一共有多少字节空间
-
如何重新定位到文件流的开头
-
如何将数据格式发输出到va_list中
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char Array[100];
/*
//注意:库函数一般返回0代表成功,-1代表失败
size_t --> sizeof的返回的无符号整型的值
FILE --> 缓存文件流(注意:指针类型)
fops_t --> 缓存文件的位置!
NULL --> 0 / 空指针
宏:
NULL --> 空指针 / 0
BUFSIZ = stdout/stdin缓冲区大小 = 512字节!
FOPEN_MAX = 系统可以同时打开的文件数量;
{
可以同时操作多个文件流
}
FILENAME_MAX
{
文件流可以打开的文件名的最大长度!
}
L_tmpnam
{
临时文件名的最大长度
}
TMP_MAX
{
tmpnam名称最大生成数量
}
{
这些宏是指向 FILE 类型的指针
stderr --> 标准错误
stdin --> 标准输入
stdout --> 标准输出
}
{
_IOFBF
_IOLBF
_IONBF
}
{
SEEK_SET:将指针定位到文件流的文件头
SEEK_END:将指针定位到文件流的文件尾
例如:
fseek(File, 1, SEEK_SET); //从文件头的第一个字节开始覆盖新内容
fseek(File, 10, SEEK_END); //从文件尾的第十个字节开始填充新内容
}
{
stderr --> 标准错误
stdin --> 标准输入流
stdout --> 标准输出流
}
函数
{
1:clearerr():当操作文件时,出现错误时,程序会根据错误号产生中断,但是clearerr可以清除错误号并关闭该文件流,继续执行main函数!
//clearerr() = 不中断 + fclose()
2:feof():判断当前是否是最后文件流的最后一个字节! ; 是最后一个返回1 , 不是返回0;
3:ferror():当检测到对文件流的操作有错时,返回1;注意不存在该文件不属于它的检测范围,因为没打开文件,文件流都没有,根本没法检测!
4:fflush():通常跟随在fprintf()后使用,作用是将写入文件的缓冲数据强制写入文件达到清理缓冲区,确保数据都被完全写入,避免写入文件过程中发生中断导致数据缺失与重写的麻烦!
5:fgetpos() = file get position / fsetpos() = file set position
{
5.1:fgetpos()与fsetpos()配合操作,fgetpos()记录文件流的某一个位置到fpos_t变量中,fsetpos()定位将File指针到该位置
5.2:两者配合使用实现从文件流的具体某个开始进行操作!但是会影响到后面的流,不能实现插入且不影响的目的!
5.3:实现对文件流的某位置的一块区域的修改,而不是在某位置进行插入!
}
6:fopen()函数注意:{ "r" = 只读 ; "w" = 只写 ;"r+" = 可读可写 ; "w+" = 创建一个只读的空文件;}
7:fread(缓存地址,扫描次数,每次扫描的单位数据的字节数,文本流);
8:freopen(文件流,方式,复制/粘贴)
{
stdin = 复制流 = 不同于从控制台获取数据,而是从文件中gets/scanf...获取数据!;
stdout = 粘贴流 = 不同于将数据输出到控制台,而是用printf输出在文件中!;
freopen()重定位流,只要用于复制文件1的内容并粘贴到文件2;
注意:释放掉stdin流与stdout流
}
9:fseek() //能快速定位到文件的头尾附近的N个字节处,并进行覆盖操作!
{
SEEK_SET:将指针定位到文件流的文件头
SEEK_END:将指针定位到文件流的文件尾
例如:
fseek(File, 1, SEEK_SET); //从文件头的第一个字节开始覆盖新内容
fseek(File, 10, SEEK_END); //从文件尾的第十个字节开始填充新内容
}
10:ftell() //计算文件流开始处到指针所指到的文件流的位置一共多少字节!
11:fwrite(数组地址,数组大小,单位数据大小,文件流)
12:remove() //删除文件,注意:已经打开的文件删不了,删除成功返回0!
13:rename() //更名文件,与remove一样,已经打开的文件无法更名,更名成功返回0;
14:rewind() //重新将文件流定位到开头!
15:setbuf() //将stdout与参数内的地址连通,参数内的地址再备份一份缓存数据
{
BUFSIZ = stdout/stdin缓冲区大小 = 512字节!
}
16:setvbuf() //?????????
{
_IOFBF:
_IOLBF:
_IONBF:
}
17:tmpfile() //建立一个虚拟临时wb+二进制文件可供用户操作,程序结束后,关闭流后虚拟文件自动删除!
{
1:安全性!
2:节省内存空间,自动清理机制!
3:"wb+" --> 建立二进制文件 "w+"建立普通文件!
}
18:temnam() //系统随机产生一个临时文件名,程序结束后自动释放!
19:fpritf()与printf()的区别!
{
区别:需要加一个文件流,其他都一样1
}
20:sprintf()与printf()的区别 //将需要printf的内容打印到字符数组中
{
区别:需要加一个字符数组名,其他都一样1
作用:
1:fprintf用于连接多个字符串
2:fprintf可以将123整型数据,转化成"123"字符数据,便于不同类型空间大小的的数据同时存储在一个char单字节的空间中!
}
21:vfprintf()与fprintf的区别,此处v = va_list代表堆栈
{
当文件流与fprintf在同一个函数中,fprintf(文件流,"%s","我的名字")可以直接写入文件流!
当文件流与vfrintf在不同的函数时,此时需要函数传参的形式,将文件流,"xxx",不定个数的参数,传给子函数
使用,vfrintf是用在在子函数中对主函数的文件流进行fprintf的解决方案!
//va_start作用:将format装填进list堆栈,%s,%c,%d这些待传参数留空,并由list后面填装
//format的模型大小被固定,也起到规定堆栈大小的作用
}
22:vprintf与printf的区别
{
printf就是用vprintf写的哟,可以了解printf的具体实现原理!
}
23:vsprintf与vprintf与sprintf的区别
{
vsprintf是vprinf与sprintf的结合版!
}
24:fscanf()
//从文件中格式化输入,和scanf()类似都是以空格和换行扫描到%s,%c,%d...
注意:scanf扫描赋值时,必须为文件流进行位置定位!
25:sscanf() //将字符数组以空格分隔赋值!
{
注意:
char *p; p = gets(); x
char *p; scanf("%s",p) x
}
26:fgetc()与getchar()区别
{
1:从指定的流获取一个字符!
2:位置坐标会自动先后移动!
//保持良好的位置坐标初始化的习惯!
}
27:fgets()
{
参数1:字符串地址
参数2:字符串字节大小
参数3:文件流
//相对于gets_s,多了一个文件流参数
}
28:fputc()
{
注意:默认文件流定位与首部,所以会覆盖后续字节!
}
29:fputs() //输入字符数组到文本流中!
30:ungetc() //将文本流中字节替换!????????
31:perror("")
{
1:输出错误消息
2:perror = printf + error
}
}
@注意:指针初始值 = NULL;
*/
void Text1()
{
FILE* File_fclose;
//缓存文件流
File_fclose = fopen("errno_text.txt", "w");
//写入文件
fprintf(File_fclose, "%s", "hello man!");
//关闭文件流
fclose(File_fclose);
}
void Text2()
{
FILE* File_fclose;
//缓存文件流
File_fclose = fopen("errno_text.txt", "r");
//错误方式写入文件,引发错误号!
fprintf(File_fclose, "%s", "hello man!");
//清除错误并关闭文件流,不会中断程序
clearerr(File_fclose);
//关闭文件流
fclose(File_fclose);
}
void Text3()
{
FILE* File_fclose;
//缓存文件流
File_fclose = fopen("errno_text.txt", "r");
char Tem;
do
{
Tem = fgetc(File_fclose);
printf("%c", Tem);
} while (!feof(File_fclose));
//关闭文件流
fclose(File_fclose);
}
void Text4()
{
FILE* File_fclose;
//缓存文件流
File_fclose = fopen("errno_text.txt", "r");
fprintf(File_fclose, "%s", "hello boy");
if (ferror(File_fclose))
{
printf("文件操作过程出错!");
}
}
void Text5()
{
FILE* File_fclose;
//缓存文件流
File_fclose = fopen("errno_text.txt", "w");
//写入文件
fprintf(File_fclose, "%s", "hello man!");
fflush(File_fclose);
//关闭文件流
fclose(File_fclose);
}
void Text6()
{
FILE* File_fclose;
fpos_t Position;
//缓存文件流
File_fclose = fopen("errno_text.txt", "w+");
//写入文件
fprintf(File_fclose, "%s", "hello\t");
fgetpos(File_fclose,&Position);
fprintf(File_fclose, "%s", "boy\t");
fflush(File_fclose);
fsetpos(File_fclose, &Position);
fprintf(File_fclose, "%s", "girl\t");
}
void Text7()
{
FILE* File_fclose;
fpos_t Position;
//缓存文件流
File_fclose = fopen("text1.txt", "w+");
fclose(File_fclose);
}
void Text8()
{
FILE* File;
char Array[10] = {NULL};
//缓存文件流
File = fopen("errno_text.txt", "r+");
fread(Array, 5, 1, File);
fprintf(File, "%s", "hello\t");
printf("%s", Array);
//写入文件
}
void Text9()
{
FILE* File;
char Get[20];
File = freopen("errno_text.txt", "r+", stdin);
gets_s(Get, 20);
File = freopen("text1.txt", "r+", stdout);
printf("%s",Get);
fclose(stdin);
fclose(stdout);
//写入文件
}
void Text10()
{
FILE* File;
//缓存文件流
File = fopen("errno_text.txt", "r+");
for (size_t i = 0; i < 5; i++)
{
fprintf(File, "%s", "hello\n");
}
fflush(File);
fseek(File, 1, SEEK_SET); //从文件头的第一个字节开始覆盖新内容
fseek(File, 10, SEEK_END); //从文件尾的第十个字节开始填充新内容
fprintf(File, "%s", "word");
fclose(File);
}
void Text11()
{
//fclose()使用方法********************
FILE* File;
unsigned int File_Len;
//缓存文件流
File = fopen("errno_text.txt", "r+");
fseek(File, 0, SEEK_END);//将指针定位到文件的最后
File_Len = ftell(File);//计算文件流开始到文件指针所指处一共多少字节!
printf("文件有%d字节!", File_Len);
//关闭文件流
fclose(File);
}
void Text12()
{
FILE* File;
char Array[] = "hello word!";
//缓存文件流
File = fopen("errno_text.txt", "w");
fwrite(Array, sizeof(Array), 1, File);
//关闭文件流
fclose(File);
}
void Text13()
{
FILE* File;
unsigned int ReMove_Sign;
char FileName[20];
printf("输入需要删除的文件名!");
gets_s(FileName,20);
File = fopen("text2.txt", "w+");
if (File == NULL)
{
printf("\n文件打开失败!\n");
}
else
{
printf("\n文件打开成功!\n");
fclose(File);
}
ReMove_Sign = remove(FileName);
File = fopen("text2.txt", "r");
if (File == NULL)
{
printf("\n文件打开失败!\n");
}
else
{
printf("\n文件打开成功!\n");
//关闭文件流
fclose(File);
}
}
void Text14()
{
FILE* File;
File = fopen("text2.txt", "w+");
if (File == NULL)
{
printf("打开失败!");
}
else
{
printf("打开成功!");
fclose(File);
if (rename("text2.txt","Text2.txt") == 0)
{
printf("更名成功!");
}
}
}
void Text15()
{
FILE* File;
char eng;
File = fopen("text2.txt", "r+");
if (File == NULL)
{
printf("打开失败!");
}
else
{
printf("打开成功!");
printf("\n\n");
for (size_t i = 0; i < 10; i++)
{
eng = fgetc(File);
printf("%c", eng);
}
rewind(File);//将文件流重新定位到开头!
printf("\n\n");
for (size_t i = 0; i < 10; i++)
{
eng = fgetc(File);
printf("%c", eng);
}
}
}
void Text16()
{
char outbuf[BUFSIZ] = {NULL};
setbuf(stdout, outbuf);
puts("hello word!");
size_t i = 0;
do
{
if (outbuf[i]!=NULL)
{
putchar(outbuf[i]);
}
else
{
puts("退出!");
break;
}
i++;
} while (1);
}
void Text18()
{
FILE* File_Tmp;
File_Tmp = tmpfile();
//写入文件
if (File_Tmp == NULL)
{
printf("文件创建失败!");
}
else
{
fclose(File_Tmp);
}
}
void Text19()
{
char* Name;
Name = tmpnam(NULL);
if (Name!=0)
{
puts(Name);
}
}
void Text20()
{
char* Str[20];
sprintf(Str, "%d\t%s\t%s", 1234,"我吐了","我又吐了");
puts(Str);
}
void write(FILE *fp,char *format,...)
{
va_list list;
//va_start作用:将format装填进list堆栈,%s,%c,%d这些待传参数留空,并由list后面填装
//format的模型大小被固定,也起到规定堆栈大小的作用
va_start(list,format);
vfprintf(fp, format, list);
va_end(list);
}
void Text21()
{
FILE* fp;
fp = fopen("text1.txt", "r+");
write(fp,"我的名字是%s","杨沁洁");
}
void write1(char* format, ...)
{
va_list list;
//va_start作用:将format装填进list堆栈,%s,%c,%d这些待传参数留空,并由list后面填装
//format的模型大小被固定,也起到规定堆栈大小的作用
va_start(list, format);
vprintf(format, list);
va_end(list);
}
void Text22()
{
write1("我的名字是%s", "杨沁洁");
}
void write2(char* format, ...)
{
va_list list;
//va_start作用:将format装填进list堆栈,%s,%c,%d这些待传参数留空,并由list后面填装
//format的模型大小被固定,也起到规定堆栈大小的作用
va_start(list, format);
vsprintf(Array,format, list);
va_end(list);
}
void Text23()
{
write2("我的名字是%s", "杨沁洁");
puts(Array);
}
void Text24()
{
char Array1[10];
FILE* file;
file = fopen("text1.txt", "r+");
if (file == NULL)
{
printf("OPEN ERROR!");
}
else
{
fprintf(file, "%s", "woc");
rewind(file); //注意,流定位到文件流的头部!
fscanf(file,"%s", Array1);
fclose(file);
}
puts(Array1);
}
void Text25()
{
char* Str = "卧槽 无情";
char Str1[10];
char Str2[10];
sscanf(Str, "%s%s", Str1,Str2);
puts(Str1);
puts(Str2);
}
void Text26()
{
char Eng;
FILE* fp;
fp = fopen("text1.txt", "r+");
do
{
Eng = fgetc(fp);
putchar(Eng);
} while (!feof(fp));
}
void Text27()
{
char Str[10];
FILE* fp;
fp = fopen("text1.txt", "r+");
fgets(Str, 60, fp);
puts(Str);
}
void Text28()
{
char Eng = 'A';
FILE* fp;
fp = fopen("text1.txt", "r+");
fputc(Eng, fp);
}
void Text29()
{
char *Eng = "卧槽,无情";
FILE* fp;
fp = fopen("text1.txt", "r+");
fputs(Eng, fp);
}
void Text30()
{
char Eng;
FILE* fp;
fp = fopen("text1.txt", "r+");
if (fp==NULL)
{
printf("OPEN ERROR");
}
do
{
Eng = fgetc(fp);
if (Eng == ',')
{
ungetc('+', fp);
}
} while (!feof(fp));
fclose(fp);
}
void Text31()
{
FILE* fp;
fp = fopen("text10.txt", "r");
if (fp == NULL)
{
perror("");
}
else
{
fclose(fp);
}
}
//***************************************主函数*************************
void STDIO_TEXT()
{
//fclose()使用方法********************
//Text1();
//clearerr()使用方法******************
//Text2();
//feof()使用方法********************
//Text3();
//ferror()使用方法*****************
//Text4();
//fflush()使用方法******************
//Text5();
//fgetpos()与fsetops()使用方法**********
//Text6();
//fopen()使用方法
//Text7();
//fread()使用方法
//Text8();
//freopen()使用方法 ?????????????未完!
//Text9();
//fseek()使用方法
//Text10();
//ftell()使用方法
//Text11();
//fwrite()使用方法
//Text12();
//remove()使用方法
//Text13();
//rename()使用方法
//Text14();
//rewind()使用方法
//Text15();
//setbuf()使用方法
//Text16();
//setvbuff()使用方法
//Text17(); ???????????????????
//tmpfile()使用方法
//Text18();
//tmpnam()使用方法
//Text19();
//sprintf()使用方法
//Text20();
//vfprintf()使用方法
//Text21();
//vprintf()使用方法
//Text22();
//vsprintf()使用方法
//Text23();
//fscanf()使用方法
//Text24();
//sscanf() 使用方法
//Text25();
//fgetc()使用方法
//Text26();
//fgets()使用方法
//Text27();
//fputc()使用方法
//Text28();
//fputs()使用方法
//Text29();
//ungetc()使用方法
//Text30();
//perror()使用方法
//Text31();
}