C语言 | 文件操作和易错点

文件操作

文件在操作系统中以页块大小来存储,不论多少字节 起始是4k,超4k变为8k

file是一个文件操作结构体,当需要对文件进行操作时,需要定义一个文件操作指针

C语言 | 文件操作和易错点

打开文件

打开文件函数原型:FILE* fopen ( const char * filename, const char * mode );
filename:路径,如果没有文件夹会报错
mode:读写方式

int main()
{
    FILE* fp=fopen("d:\\fxl.txt","w");
}

读写文件

fprinf(fp,"%d ",ar[i]);//ASCII码输出到fp中   itoa函数
fscanf(fp,"%d",&br[i];//写入到br中  用到itoa函数,扫描到不是数字字符就停止
//当用,分割时
fscanf(fp,"%d,",&br[i])//应加,写入时会把,当做格式一部分,使得下次读取fp时是在数字上而不是,上
       

atoi() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(’\0’)才结束转换,并将结果返回。

所以用,等除了空白字符(例如空格,tab缩进)以外的其他符号,应严格按照格式来进行格式化写入

二进制文件的读写

:size_t fwrite ( const void * ptr, size_t size, size_t count,FILE * stream );

ptr:这是指向要被写入的元素数组的指针。
size:这是要被写入的每个元素的大小,以字节为单位。count:这是元素的个数,每个元素的大小为size字节。
stream:这是指向FILE对象的指针,该FILE对象指定了一个输出流。

在内存中什么形式就是按什么形式写进去 int a=1;在内存中是01000000(小端) 所以在读的时候要按照整形大小来偏移

关闭文件

文件位置

long ftell ( FILE *stream ) ;返回当前文件位置,字节为单位

fpos_t fgetpos( FILE *stream,fpos_t *ps) fpos_t为64位int 功能与上相同

int fseek( FILE*stream, long offset, int origin ); 执行成功0
设置文件流stream 的文件位置指示器为offset所指向的值。
1)若stream 以二进制模式打开,则新位置准确地是文件起始后(若origin为SEEK SET)或当前文件位置后(若origin为SEEK_CUR ),或文件结尾后(若origin为SEEKEND)的offset字节。不要求二进制流支持SEEK_END,尤其是是否输出附加的空字节。
2)若stream以文本模式打开,则仅有的受支持offset值为零(可用于任何origin)和先前在关联到同一个文件的流上对ftell的调用的返回值(仅可用于SEEK_SET的origin ).
3)若stream为宽面向,则一同应用对文本和二进制流的限制(允许ftell的结果与SEEK_SET一同使用,并允许零offset以SEEK_SET和SEEK_CUR但非SEEK_END为基准)。
除了更改文件位置指示器,fseek还撤销ungetc的效果并清除文件尾状态,若可应用。若发生读或写错误,则设置流的错误指示器( ferror )而不影响文件位置.
stream:要修改的文件流
offset:相对origin迁移的字符数
origin: offset所加上的位置。它能拥有下列值之一: SEEK_SET、SEEK_CUR、SEEK_END

int feof( FILE*stream );

//通过ftell和fseek获取字节数
fseek(pf,0,SEEK_END);
int len=ftell(pf);//如果以文本形式打开,会把回车统计成两个字节,载入缓冲区时会合并为一个,所以获得的长度是比实际长度长
//二进制不会


fgetc getc从文件流获取一个字符
fgets从文件流获取一个字符串
fputc putc将一个字符写入文件流
fputs将一个字符串写入文件流
getchar从stdin读取一个字符
gets(C11中移除)
gets_s从stdin读取一个字符串
putchar将一个字符写入stdout
puts将一个字符串写入stdout
ungetc将一个字符送回文件流
getchar()从缓冲区读取一个字符

char cf;
cf=getchar();
//如果输入1回车,那么从标准输入设备输入的数据载入缓冲区就有1+回车这两个数据,读取完1之后还会有回车的ascii在缓冲区中
//若缓冲区没有数据会从标准输入设备输入

辨析

getchar_s()到回车符停止 scanf_s到空格停止,都是从缓冲区读取

puts相当于printf("%s \n",str);

int feof( FILE*stream );和fgetc getc fgets:
getc在读到txt文档最后一个字符的时候,fp指向最后一个字符,读出字符后,fp向后移,fp指向EOF,进行下一次循环,feof判断是否到达文档末尾:由于上一次fgetc读出的是文档最后一个字符,所以即使fp当前已经指向了EOF,feof函数还是会返回假,这样循环就又继续了,下一次循环中,就会将fp指向的EOF输出,fp后移(已经到达文档尾,无法后移);
fgets遇到文件尾指示器时不改变 str 所指向数组的内容

上一篇:Ferrum Network将其产品和服务集成至Moonriver


下一篇:当数据和要加载的模型不在同一个cuda上时的处理方法