C和指针之IO总结
来源:互联网 发布:乐高编程软件 编辑:程序博客网 时间:2024/06/04 18:06
1、流
io操作就是简单的从程序移进或移出字节的事情,这种字节流便称为流
2、流的两种类型,文本流和二进制流
1)、文本流:文本流是指在流中流动的数据是以字符形式出现2)、二进制流:二进制流是指流动的是二进制数字序列,若流只有字符,则用一个字节的二进制ASCII码表示,若是数字,则用对应的二进制数表示。在流入流出时,对\n符号不进行变换
例如5678这个数,在文本流中用其ASCII码表示为:
5678的存储形式为:ASCII码: 00110101 00110110 00110111 00111000 (四个字节)
5678的存储形式为:二进制: 00010110 00101110 (两个字节)
共占4字节。而在二进制流中则表示为:00000111 11010001 用十六进制就是07D1。只占两字节,二进制流比文本流节省空间,且不用进行对\n的转换,可以大大加快流的速度,提高效率。因而,对于含有大量数字信息的数字流,可以采用二进制流的方式;对于含有大量字符信息的流,则采用文本流的方式。
1)文本流的特性,文本行的最大长度,标准最少24字符,结束方式,在dos系统,以一个回车符和一个换行符结尾,unix只适用一个换行符结尾
计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
C中文本或二进制读写都是缓冲区与文件中二进制流的交互,只是文本读写时有回车换行的转换.所以当写缓冲区中无换行符''\n''(0AH),文本写与二进制写的结果是一样的,同理,当文件中不存在''\r\n''(0DH0AH)时,文本读与二进制读的结果一样.
3、io流的3种基本形式处理
1、单个字符int fgetc(FILE *stream)
int fputc(int character, FILE *stream);
int getc(FILE *stream)
int putc(int character, FILE *stream);
int getchar(void)
int putchar(int character);
2、文本行
未格式化行的i/o
char *fgets(char *buffer, int buffer_size, FILE *stream);
char *gets(char *buffer);
int fputs(char const *buffer, FILE *stream);
int puts(char const *buffer);
格式化i/o
int fscanf(FILE *stream, char const *format, ...);
int scanf(char const *format, ...);
int sscanf(char const *string, char const *format, ...);
4、部分Demo
#include <stdio.h>#include <stdlib.h>/**如果没有找到打开的文件**/int main(){ FILE *input; input = fopen("data20", "r"); if (input == NULL) { perror("data3"); exit(EXIT_FAILURE); } return 0;}/**1111deMacBook-Pro:Music a1111$ gcc -g fopen.c -o fopen1111deMacBook-Pro:Music a1111$ ./fopendata3: No such file or directory**/
#include <stdio.h>#include <ctype.h>//转换从标准输入读入的数字int read_int(){ int value; int ch; while ((ch = getchar()) != EOF && isdigit(ch)) { value *= 10; value += ch - '0'; } return value;}int main(){ int value = read_int(); printf("value is %d\n", value); return 0;}/**1111deMacBook-Pro:Music a1111$ gcc -g getc.c -o getc1111deMacBook-Pro:Music a1111$ ./getc1233value is 12331111deMacBook-Pro:Music a1111$**/~
#include <stdio.h>#define MAX_LENGTH 1024//复制文件void copylines(FILE *input, FILE *output){ char buffer[MAX_LENGTH]; while (fgets(buffer, MAX_LENGTH, input) != NULL) fputs(buffer, output);}int main(){ FILE *input = fopen("data2", "r"); if (input != NULL) { FILE *output = fopen("data3", "w"); if (output != NULL) { copylines(input, output); fclose(output); } else puts("data3 is NULL"); fclose(input); } else puts("data2 is NULL"); return 0;}
#include <stdio.h>int main(){ char str[512] = {0}; sscanf("123456", "%4s", str); printf("str is %s\n", str); //读到大写字母为止 sscanf("123aaadf4aD45dbcdBDD", " %[^A-Z]", str); printf("str is %s\n", str); return 0;}/**1111deMacBook-Pro:Music a1111$ vim sscanf.c1111deMacBook-Pro:Music a1111$ gcc -g sscanf.c -o sscanf1111deMacBook-Pro:Music a1111$ ./sscanfstr is 1234str is 123aaadf4a**/
#include <stdio.h>#include <stdlib.h>//格式化数据输入到文本FILE* stream;int main(void){ int i = 15; double fp = 15.5; char s[] = "hello word"; char c = '\n'; stream = fopen("fprintf.txt", "w"); fprintf(stream, "%s%c", s, c); fprintf(stream, "%d\n", i); fprintf(stream, "%f\n", fp); fclose(stream); return 0;}/**hello word1515.500000**/
#include <stdio.h>//格式化输入数据到文本int main(){ FILE* fp; int i = 117; char* s = "chenyu"; fp = fopen("text.dat", "w"); fputs("total", fp); fputs(":", fp); fprintf(fp, "%d\n", i); fprintf(fp, "%s", s); fclose(fp); return 0;}/**total:117chenyu**/
#include <stdio.h>//ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数int main(void){ FILE *stream; stream = fopen("MYFILE.TXT", "w+"); fprintf(stream, "This is a test"); printf("The file pointer is at byte %ld\n", ftell(stream)); fclose(stream); return 0;}/**1111deMacBook-Pro:Music a1111$ vim ftell.c1111deMacBook-Pro:Music a1111$ gcc -g ftell.c -o ftell1111deMacBook-Pro:Music a1111$ ./ftellThe file pointer is at byte 14**/
int fprintf(FILE *stream, char const *format, ...);
int printf(char const *format, ...);
int sprintf(char *buffer, char const *format, ...);
3、二进制数据
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
size_t fwrite(void *buffer, size_t, size, size_t count, FILE *sread);
阅读全文
0 0
- C和指针之IO总结
- C和指针之IO流和缓冲区
- c和指针 之“输入输出”总结
- C和指针之字符串总结
- 《C和指针学习笔记》之指针总结
- C总结之指针
- 《C和指针》总结
- C语言提高之——C和指针总结
- C和指针之部分理解和编码总结
- C和指针之数组和函数部分总结
- C和指针之动态内存分配常见问题和总结
- C和指针之字符串memcpy、memmove、memset使用总结
- c/c++ 之指针的指针总结
- 《C和指针》阅读总结
- 读书笔记之《C和指针》
- C和指针之字符串之strlen、strcpy、 strcat、strcmp使用总结
- C和指针课后练习题总结
- 《C和指针》学习备忘总结
- 基因数据处理53之cs-bwamem集群版运行paird-end(1千万条100bp的reads)
- 基因数据处理54之bwa-mem运行paird-end(1千万条100bp的reads)
- idea整理文档
- 基因数据处理55之cs-bwamem安装记录(idea maven ,没有通过pl)
- 基因数据处理56之bwa运行paird-end(1千万条100bp的reads).md
- C和指针之IO总结
- 机器学习12月16日日记(短)
- android okhttp3的封装
- 链表问题——复制含有随机指针节点的链表
- ssh框架整合的步骤
- android子进程发送toast
- openstack4j 源码分析(二) model对象
- MYSQL.导入超过100M数据库方法,MYSQL命令行导入大数据库方法
- python中any()和all()如何使用