可以免费申请试用的网站,个人能进行网站开发,百度一下搜索引擎大全,国内免费产品发布网站萌新的学习笔记#xff0c;写错了恳请斧正。 目录
光标#xff08;文件位置指示器#xff09;
文件的顺序读写
fgetc
使用实例
fputc
使用实例
fgets
fputs
使用实例
fscanf
fprintf
fread
fwrite
使用实例 光标#xff08;文件位置指示器#xff09;
我们…萌新的学习笔记写错了恳请斧正。 目录
光标文件位置指示器
文件的顺序读写
fgetc
使用实例
fputc
使用实例
fgets
fputs
使用实例
fscanf
fprintf
fread
fwrite
使用实例 光标文件位置指示器
我们平常打字的时候就知道光标这个概念而程序在打开文件后也是有一个光标用于控制文件的读写。我们一般说文件指针指向文件的哪个位置其实就是光标文件位置指示器指向文件的某个位置而这个信息也是保存在对应流的结构体中的。
读和写操作都是从光标的位置进行而光标的位置也随着读写移动
文件的顺序读写
文件的顺序读写就是从光标的位置开始按顺序向后读写内容
文件顺序读写时我们没法随意控制光标的位置只能让系统自己控制光标
fgetc
#include stdio.h
int fgetc( FILE* stream );
fgetc是字符输入函数从指定的输入流读取下一个字符并返回这个字符
如果读取失败则返回EOF但是遇到文件尾导致的读取失败会设置流结构体上的文件尾指示器这是有用的后面feof函数会讲而其他错误导致的失败会设置流结构体上的错误指示器这在ferror函数中用得到
其实getchar其实就可以理解为fgetc(stdin)从标准流读一个字符
但是注意尽量使stream不要是一个带有副作用的表达式它被重复计算
使用实例
其中的错误处理部分暂且不表后面讲
#include stdio.h
#include stdlib.hint main()
{FILE* fp fopen(test.txt, r);if (!fp){perror(File opening failed);return EXIT_FAILURE;}int c; // 注意int非char要求处理EOFwhile ((c fgetc(fp)) ! EOF) // 标准C I/O读取文件循环{ putchar(c);}if (ferror(fp))puts(I/O error when reading);else if (feof(fp))puts(End of file reached successfully);fclose(fp);fp NULL;return EXIT_SUCCESS;
}
fputc
#include stdio.h
int fputc( int ch, FILE* stream );
fputc是字符输出函数向指定的输入流输出字符并返回这个字符
如果输出失败则返回EOF并设置流结构体上的错误指示器
其实putchar(ch)其实就可以理解为fputc(ch, stdin)向标准流输出一个字符
但是注意尽量使stream不要是一个带有副作用的表达式它被重复计算
使用实例
其中的错误处理部分暂且不表后面讲
#include stdio.h
#include stdlib.hint main()
{int ret_code 0;for (char c a; (ret_code ! EOF) (c z); c)ret_code putc(c, stdout);/* 测试是否抵达 EOF */if (ret_code EOF)if (ferror(stdout)){perror(putc());fprintf(stderr, putc() failed in file %s at line # %d\n, __FILE__, __LINE__ - 7);exit(EXIT_FAILURE);}putc(\n, stdout);return EXIT_SUCCESS;
}
fgets
#include stdio.h
char* fgets( char* str, int count, FILE* stream );
fgets是文本行输入函数从指定的输入流读取最多count-1个字符并将其存储在str所指向的字符数组以覆写的形式不会清除原本内容若是遇到文件尾或换行符则提前结束输入。如果是遇到换行符结束那么str的结尾也将包含一个换行符如果是遇到文件尾结束那么str的结尾没有换行符。只要没有出错读取的字符串结尾都会补上\0。
如果读取成功则返回值就是str如果一个字符都没读取就直接遇到文件尾则判定为失败返回NULL且不会以\0覆写str的首字节同时设置流结构体的文件尾指示器如果遇到其他错误导致失败则设置流结构体的错误指示器和errno此时str数组会发生什么谁也不知道
count小于等于1的情况是未定义的不要这么做
fputs
#include stdio.h
int fputs( const char* str, FILE* stream );
fputs是文本行输出函数向指定的输出流stream输出以\0结尾的字符串str的每一个字符空字符不被写入。如果输出成功返回一个非负值未定义有些编译器返回写入的字符数有些返回最后一个字符如果输出失败返回EOF并设置流结构体的错误指示器和errno。
fputs与puts还有一个区别puts在输出后会再多输出一个换行符fputs不会
使用实例
#include stdio.hint main()
{int rc fputs(Hello world!, stdout);if (rc EOF)perror(fputs());return EXIT_SUCCESS;
}
fscanf
#include stdio.h
int fscanf( FILE* stream, const char* format, ... );
fscanf相比scanf除了可以选择从任意流stream输入外就没有什么区别了都有被读字符串应当以\0结尾和可变参数列表。返回值为成功接受参数的数量可以为0。
直接遇到文件尾或读取失败则返回EOF并设置流结构体上相关指示器
fprintf
#include stdio.h
fprintf( FILE* stream, const char* format, ... );
fprintf相比printf除了可以选择向任意流stream输出外就没有什么区别了都有格式控制字符串和可变参数列表。返回值为输出到流的字符数如果输出错误或者编码错误则返回一个负值未定义。
fread
#include stdio.h
size_t fread( void* buffer, size_t size, size_t count, FILE* stream );
fread是二进制输入函数从指定流stream读取最多count个大小为size字节的对象到数组buffer中。读取成功则返回读取的对象数读取出现错误或文件尾返回值是小于count的未定义值并设置流结构体上相关指示器如果size或count是零则返回零且不进行其他动作。 官网上描述如下 如同转译每个对象为 unsigned char 数组并对每个对象调用 size 次 fputc 以将那些 unsigned char 按顺序写入 stream 一般写入。文件位置指示器前进写入的字节数。 fwrite
fread是二进制输出函数从数组buffer向指定流stream输出最多count个大小为size字节的对象。输出成功则返回读取的对象数输出出现错误返回值是小于count的未定义值如果size或count是零则返回零且不进行其他动作。 官网上描述如下 如同转译每个对象为 unsigned char 数组并对每个对象调用 size 次 fputc 以将那些 unsigned char 按顺序写入 stream 一般写入。文件位置指示器前进写入的字节数。 使用实例 其中fseek函数用于移动光标后面随机读写会讲
#include stdio.h
#include stdlib.hstruct Stu
{char name[20];int age;float score;
};int main()
{struct Stu s { zhangsan, 20, 99.9 };struct Stu d { 0 };FILE* pf fopen(dat.txt, wb);if (!pf){perror(fopen);return EXIT_FAILURE;}fwrite(s, sizeof(s), 1, pf);fseek(pf, 0, SEEK_SET);fread(d, sizeof(s), 1, pf);printf(%s %d %.1f, d.name, d.age, d.score);fclose(pf);pf NULL;return EXIT_SUCCESS;
}