文件打开 fopen 文件关闭 fclose
字符输入(单个字符)
int fgetc(FILE *stream);
int getc(FILE *stream); //宏
int getchar(void);
#include <stdio.h>
int main(int argc, char **argv)
{
FILE *fp;
int rec;
fp=fopen("1.txt","r+");
if (fp==NULL)
{
perror("fopen");
return 0;
}
// rec=fgetc(fp);
// printf("Get char=%c\n", rec);
int wrc='w';
rec=fputc(wrc, fp);
if(rec==-1)
{
perror("fputc");
fclose(fp);
return 0;
}
putchar(wrc);
fclose(fp);
}
行输入(读取整个行)
char *fgets(char *s, int size, FILE *stream);
#include <stdio.h>
int main(int argc, char **argv)
{
char buff[100];
char * ret;
FILE *fp;
fp=fopen("1.txt","r");
if(fp==NULL)
{
perror("fopen");
return 0;
}
//ret=fgets(buff,5,stdin);//从标准输入读取
ret=fgets(buff,5,fp);//从文件读取
if(ret==NULL)
{
perror("fgets");
fclose(fp);
return 0;
}
printf("buff=%s\n",buff);
fclose(fp);
}
注意 标准输入就是从键盘上输入
stdout 标准输出 就是从键盘上输出
行输出(写整行)
int puts(const char *s); 没有说明输出位置 说明是stdout 输出到屏幕上
int fputs(const char *s, FILE *stream); 输出到文件中 FILE *stream 设置为stdout输出到屏幕
流的定位:
long ftell(FILE *stream);
long fseek(FILE *stream, long offset, int whence);
void rewind(FILE *stream);
fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END
SEEK_SET 从距文件开头 offset 位移量为新的读写位置
SEEK_CUR:以目前的读写位置往后增加 offset 个位移量
SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量
offset参数:偏移量,可正可负
标准IO练习
time()用来获取系统时间(秒数)
time_t time(time_t *seconds) 1970.1.1 0:0:0
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; /* 夏令时 */
};
二进制文件的读写
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
int main(int argc, char **argv)
{
int fd;
int ret;
char buf[32]="hello world";
char buf2[100]={0};
fd=open("test.txt",O_RDWR|O_CREAT|O_APPEND,0666);
if (fd<0)
{
printf("open file error\n");
return 0;
}
printf("successful.fd=%d\n",fd);
ret=write(fd,buf,strlen(buf));
if(ret<0)
{
perror("WRITE");
goto END;
}
printf("write count=%d\n",ret);
lseek(fd,0,SEEK_SET);//将指针移动到文件头部
// close(fd);
// fd=open("test.txt",O_RDWR|O_CREAT|O_APPEND,0666);
ret=read(fd,buf2,100);
printf("ret = %d\n",ret);
if(ret<0)
{
perror("read");
goto END;
}
buf2[99]=0;
printf("read buf2=%s\n",buf2);
END:
close(fd);
}
注意!!!同一个文件编程 文件写完后 文件指针指向文件末尾,这个时候读 读不出内容 要 将指针移动到文件头部
文件流的刷新和定位
注意printf 不加换行符不能打印 具体原因见连接
Linux下printf函数不加换行符就不能输出打印的内容_单片机printf不加回车无法打印_路痴的兔子的博客-CSDN博客
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
printf("abcdefg");
fflush(stdout);//要有这个 刷新缓冲区
while(1)
{
sleep(1);
}
}
流的定位:
long ftell(FILE *stream);
long fseek(FILE *stream, long offset, int whence);
void rewind(FILE *stream);
fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END
SEEK_SET 从距文件开头 offset 位移量为新的读写位置
SEEK_CUR:以目前的读写位置往后增加 offset 个位移量
SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量
offset参数:偏移量,可正可负
#include <stdio.h>
int main(int argc, char **argv)
{
FILE *fp;
fp=fopen("1.txt","w");
if(fp==NULL)
{
perror("fopen");
return 0;
}
fwrite("abcdef",6,1,fp);
fseek(fp,-2,SEEK_CUR);//指针指向文件当前位置-2单位 相当于e 接着写入vvv 吧ef替换掉
fwrite("vvv",3,1,fp);
}
输出abcdvvv
格式化输出和输入
格式化输出
sprintf 和fprintf
sprintf 输出到指定字符串
fprintf 输出到文件
格式化输入
fscanf
sscanf