#include
int fflush(FILE *fp);
成功
时返回0
;出错
时返回EOF(-1)
流缓冲区
中的数据
写入实际的文件
Linux
下只能刷新输出缓冲区
,输入缓冲区丢弃
屏幕
使用fflush(stdout)
long ftell(FILE *stream); //获取定位
/*定位到指定位置*/
long fseek(FILE *stream, long offset, int whence);
void rewind(FILE *stream); //定位到内容开头
fseek函数
的hence参数
:SEEK_SET
/SEEK_CUR
/SEEK_END
SEEK_SET
: 从距文件开头 offset
位移量为新的读写位置SEEK_CUR
:以目前的读写位置
往后增加 offset
个位移量SEEK_END
:将读写位置
指向文件尾
后再增加 offset
个位移量offset参数
:偏移量,可正可负
注意事项:
1 文件的打开使用a模式 fseek无效
2 rewind(fp) 相当于 fseek(fp,0,SEEK_SET);
3 这三个函数只适用2G以下的文件
示例:(获取文件长度)
FILE *fp;
if ((fp = fopen(“test.txt”, “r+”)) == NULL)
{
perror(“fopen”);
return -1;
}
fseek(fp, 0, SEEK_END);
printf(“length is %d\n”, ftell(fp));
#include
int ferror(FILE *stream);
int feof(FILE *stream);
ferror()
:返回1
表示流出错
;否则返回0
feof()
:返回1
表示文件已到末尾
;否则返回0
#include
int printf(const char *fmt, …);
int fprintf(FILE *stream, const char *fmt, …);
int sprintf(char *s, const char *fmt, …);
成功时
返回输出的字符个数
;出错时
返回EOF(-1)
fprintf
:将格式化的字符串打印到文件sprintf
:将格式化的字符存入字符类型的数组中示例:
以指定格式 “年-月-日” 分别写入文件和缓冲区
int year, month, date;
FILE *fp;
char buf[64];
year = 2014; month = 10; date = 26;
fp = fopen(“test.txt”, “a+”);
fprintf(fp, “%d-%d-%d\n”, year, month, date);
sprintf(buf, “%d-%d-%d\n”, year, month, date);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
成功时
返回输出的字符个数
;出错时
返回EOF(-1)
作用与格式化输出相反
重点掌握sprintf 和sscanf
程序要求:
每隔1秒
向文件1.txt
中写入当前系统时间
,格式如下:
1, 2014-10-15 15:16:42
2, 2014-10-15 15:16:43
无限循环
,直到按Ctrl-C
中断程序每次执行程序
时,系统时间
追加到文件末尾
,序号递增
1, 2014-10-15 15:16:42
2, 2014-10-15 15:16:43
3, 2014-10-16 11:35:07
4, 2014-10-16 11:35:08
写前准备:
time()
:用来获取系统时间
(秒数)/*获得的时间是1970.1.1 0:0:0到现在的所过的秒数*/
time_t time(time_t *seconds)
localtime()
:将系统时间
转换成本地时间
struct tm *localtime(const time_t *timer)
struct tm
{
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月份,范围从 0 到 11 */
int tm_year; /* 自 1900 起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};
注意:
int tm_mon
: 获取的值
要加1
是正确的月份int tm_year
: 获取的值
加1900
是正确的年份得到文件内的所有行
数量:
while(fgets(buf,32,fp)!=NULL)
{
if(buf[strlen(buf)-1] =='\n') //注意判断是否是一行结束
{
linecount++;
}
}
fflush
,将缓存区的内容
写到文件内。标准IO
磁盘文件的缓冲区一般为4096
标准输出
的全缓冲区别,标准输出
是1024
程序为:
/*
* @Author: xiuchengzhen
* @Date: 2022-03-16 19:40:09
* @LastEditTime: 2022-03-16 21:00:03
*/
#include
#include
#include
#include
int main(int argc, const char *argv[])
{
long int clock;
struct tm *clocktim;
int order = 1;
char str[32] = {0};
FILE *p = fopen("1.txt", "a+");
if(p == NULL)
{
perror("fopen:");
return -1;
}
while(fgets(str, 32, p)) //得到最底层行号
{
if(str[strlen(str)-1] == '\n')
order++;
}
while(1)
{
clock = time(NULL); //得到系统时间
clocktim = localtime(&clock); //将系统时间转换为本地时间
printf("%04d-%02d-%02d %02d:%02d:%02d\n", clocktim->tm_year+1900, clocktim->tm_mon+1, clocktim->tm_mday,
clocktim->tm_hour, clocktim->tm_min, clocktim->tm_sec); //打印在标准输出,看是否正确
fprintf(p,"%d.%04d-%02d-%02d %02d:%02d:%02d\n", order, clocktim->tm_year+1900, clocktim->tm_mon+1,
clocktim->tm_mday,clocktim->tm_hour, clocktim->tm_min, clocktim->tm_sec); //打印入文件
fflush(p); //刷新流,使缓存区内容写入文件
order++; //序号自增
sleep(1); //延时1秒
}
fclose(p);
return 0;
}