【从零开始的嵌入式生活】文件I/O1——标准I/O(2)

简介: 【从零开始的嵌入式生活】文件I/O1——标准I/O(2)

流操作

字符的输入输出

字符的输入


#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream); //宏
int getchar(void);


成功时返回读取的字符;若到文件末尾或出错时返回EOF

getchar()等同于fgetc(stdin)

getc和fgetc区别是一个是宏一个是函数

建议使用fgetc()

示例代码:


#include <stdio.h>
int main(){
       char ch;
       ch = fgetc(stdin);
       printf("read char:%c\n",ch);
       return 0;
}


如果是从文件读入就是:


#include <stdio.h>
int main(){
      char ch;
      FILE *fp;
      fp = fopen("1.txt","r");
      if(fp != NULL){
              ch = fgetc(fp);
              printf("read char:%c\n",ch);
      }else{
              perror("open");
      }
      return 0;
}


字符的输出


#include  <stdio.h>
int  fputc(int c, FILE *stream);
int  putc(int c, FILE *stream);
int  putchar(int c);


成功时返回写入的字符;出错时返回EOF

putchar©等同于fputc(c, stdout)

相关示例代码在/io/1.stand_io/2.open_close

思考题:

如何利用fgetc / fputc实现文件的复制?

通过命令行参数传递源文件和目标文件名

通过fgetc返回值判断是否读到文件末尾

示例代码在io/1.stand_io/2.open_close/fgetc_fputc_copy.c

补充一个命令:diff 1.txt 2.txt可以对比两个文件的差异。


行输入输出

字符的输入


#include  <stdio.h>
char  *gets(char *s);//不要用!!!!!
char *fgets(char *s, int size, FILE *stream);


成功时返回s,到文件末尾或出错时返回NULL

gets不推荐使用,容易造成缓冲区溢出已经被废除!

遇到’\n’或已输入size-1个字符时返回,总是包含’\0’


字符的输出


#include  <stdio.h>
int  puts(const char *s);
int fputs(const char *s,  FILE *stream);


成功时返回输出的字符个数;出错时返回EOF

puts将缓冲区s中的字符串输出到stdout,并追加’\n’

fputs将缓冲区s中的字符串输出到stream,不追加 ‘\n’


对象的输入输出

#include  <stdio.h>
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);


成功返回读写的对象个数;出错时返回EOF

既可以读写文本文件,也可以读写数据文件

效率高

相关的操作在/io/1.stand_io/2.open_close


刷新流和定位

刷新流

#include <stdio.h>
int fflush(FILE *fp);


成功时返回0;出错时返回EOF

将流缓冲区中的数据写入实际的文件

Linux下只能刷新输出缓冲区,输入缓冲区丢弃

示例代码


#include <stdio.h>
int main(){
       int i = 0;
       for(i = 0; i < 100; ++i){
               printf("a");
               fflush(stdout);
       }
       while(1);
       return 0;
}


定位流

看下图,当进行写操作的时候,我们的指针会不断的往后走,如果我们想要回到b的位置进行重写,就是流定位。

#include  <stdio.h>
long ftell(FILE *stream);
long fseek(FILE *stream, long offset,  int whence);
void rewind(FILE *stream);//回到文件头


ftell() 成功时返回流的当前读写位置,出错时返回EOF

fseek()定位一个流,成功时返回0,出错时返回EOF

whence参数:SEEK_SET/SEEK_CUR/SEEK_END

示例程序:


#include <stdio.h>
int main(){
       FILE *fp;
       int st;
       char buf[16];
       fp = fopen("1.txt","a+");
       if(fp){
               st = ftell(fp);
               printf("st:%d\n", st);
               fputs("abcd",fp);
               st = ftell(fp);
               printf("st:%d\n", st);
               //fseek(fp, 1, SEEK_SET);
               rewind(fp);
               fgets(buf, 5, fp);
               printf("buf:%s\n",buf);
       }
       return 0;
}

判断流是否出错和结束

#include  <stdio.h>
int ferror(FILE *stream);
int feof(FILE *stream);


ferror()返回1表示流出错;否则返回0

feof()返回1表示文件已到末尾;否则返回0

格式化输出和输入

格式化输出

#include  <stdio.h>
int printf(const char *fmt, …);
int fprintf(FILE *stream, const char *fmt, …);
int sprintf(char *s, const char *fmt, …);


成功时返回输出的字符个数;出错时返回EOF

使用起来很方便,强烈推荐!

示例代码详见:/io/1.stand_io/2.open_close/sprintf.c


格式化输入

int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);


示例代码详见:/io/1.stand_io/2.open_close/scanf.c


思考和练习

每隔1秒向文件test.txt中写入当前系统时间,格式如下:


1,  2014-10-15 15:16:42
2,  2014-10-15 15:16:43


该程序无限循环,直到按Ctrl-C中断程序


提示:


time()用来获取系统时间(秒数)

localtime()将系统时间转换成本地时间

sleep()实现程序睡眠

示例代码:/io/1.stand_io/2.open_close/demo.c

写在最后

文件IO没特别多的东西,今天已经过了一大半了,明天我就会更新完,我尽量一天一更,大家和我一起变强呀!最后三连即可提高学习效率!!!


另外我在更新的就是算法笔记的一些例题笔记,这个系列是用于提高我的算法能力,如果有兴趣对算法领域感兴趣找不到合适的入门文章也可以追更,如果我更新的太慢了请大家点赞收藏,一键三连才能更有更新的动力呀0.0


相关文章
嵌入式C++(十三)(下)
嵌入式C++(十三)(下)
112 0
嵌入式C++(十三)(下)
|
C++ 索引 容器
嵌入式C++(十一)
嵌入式C++(十一)
127 0
|
设计模式 算法 搜索推荐
嵌入式C++(十三)(上)
嵌入式C++(十三)(上)
111 0
|
缓存 移动开发 Linux
【从零开始的嵌入式生活】文件I/O1——标准I/O(1)
【从零开始的嵌入式生活】文件I/O1——标准I/O(1)
【从零开始的嵌入式生活】文件I/O1——标准I/O(1)
|
存储 小程序 编译器
【从零开始的嵌入式生活】必备基础知识1——数据的表示和程序编译调试
【从零开始的嵌入式生活】必备基础知识1——数据的表示和程序编译调试
【从零开始的嵌入式生活】必备基础知识1——数据的表示和程序编译调试
【从零开始的嵌入式生活】必备基础知识7——函数(1)
【从零开始的嵌入式生活】必备基础知识7——函数(1)
【从零开始的嵌入式生活】必备基础知识7——函数(1)
|
Serverless
【从零开始的嵌入式生活】必备基础知识7——函数(2)
【从零开始的嵌入式生活】必备基础知识7——函数(2)
【从零开始的嵌入式生活】必备基础知识7——函数(2)
|
机器学习/深度学习 算法 Linux
【从零开始的嵌入式生活】必备基础知识3——输入输出
【从零开始的嵌入式生活】必备基础知识3——输入输出
【从零开始的嵌入式生活】必备基础知识3——输入输出