1、getchar()/putchar()
【原 型】int getchar (void); / intfputchar(char c);
【返回值】读取/写入字符成功则函数返回值为该字符的ASIIC值,不成功则返回值为EOF。
getchar() <==>getc(stdin); putchar(char ch) <==>putc(char ch,stdout);
2、getc()/putc() 与fgetc()/fputc()
【头文件】#include <stdio.h>
【原 型】int fgetc ( FILE * stream ); / int fputc(char ch, FILE* fp);
int getc(FILE * stream); / int putc(char ch, FILE* fp);
【功 能】从流中取单个字符 / 写入一字符到指定流
【参 数】参数*steam为要从中读取/写入字符的文件流;ch为要写入流中的字符。
【返回值】读取/写入字符成功则函数返回值为该字符的ASIIC值,不成功则返回值为EOF。
【说 明】getc()/putc()与fgetc()/fputc作用相同,但在某些库中getc()/putc()为宏定义,而非真正的函数。
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(void){ int ch, len, i = 0; FILE* fstream; char msg[100] = "Hello!I have read this file."; fstream=fopen("test.txt","at+"); if(fstream==NULL){ printf("read file test.txt failed!\n"); exit(1); } while( (ch = getc(fstream))!=EOF){ /*getc从文件流中读取字符*/ putchar(ch); } putchar(‘\n‘); len = strlen(msg); while(len>0){ /*循环写入*/ putc(msg[i],fstream); putchar(msg[i]); len--; i++; } fclose(fstream); return 0; }
3、gets()/puts() 与fgets()/fputs()
【头文件】#include <stdio.h>
【原 型】char* fgets ( char *str, int size, FILE *fp ); / int fputs(const char *str, FILE *fp);
cahr* gets(char *str); / int puts(const char *str);
【功 能】
char* gets(char *str);
从stdin流中读取字符串,直至接受到换行符或EOF时停止,将读取的结果存放在str指针所指向的字符数组中。(不读取换行符,最后自动添加一个‘\0‘。,并由此来结束字符串。)
注意:
1. gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,为了避免这种情况,我们可以用 fgets ( buf, size, stdin )来替换gets()(在linux下,程序中用gets(),编译会有warning: the `gets‘ function is dangerous and should not be used)。
2. gets函数可以接收空格,scanf()不能接受空格。
int puts(const char *str);
puts()函数用来向标准输出设备(屏幕)写字符串并换行;注意:puts在输出字符串后自动换行(自动加‘\n’)。
例1:char a[5]="test"; puts(a);
例2:puts("Hello,C:"); 与 printf("Hello,C:\n"); 两者实现结果相同。
char* fgets ( char *str, int size, FILE *fp );
从fp指定的文件中读取size-1个字符到str指向的字符数组中。fgets函数读到‘\n’停止,并读取‘\n’字符,读完后再末尾自动加‘\0’字符。fget函数读取字符无需担心超出str置想的数组空间大小问题,它会根据数组的大小自动停止读取(当读到size-1个时停止,末尾加‘\0’)。一般用fgets ( buf, size, stdin )从键盘读取字符,推荐使用!!!
int fputs(const char *str, FILE *fp);
将Str所指向的字符串写入到fp中,字符串结束标志‘\0’不写入。str可以是字符串数组名,或者是字符串指针。
【返回值】gets()和fgets()成功返回str,出错或者读到了末尾返回NULL。
fputs()和puts成功返回非负数,不成功则返回值为EOF。
4、fscanf()/fpintf()
【头文件】#include <stdio.h>
【原 型】int fscanf(FILE * stream, const char *format, ...);
int fprintf(FILE * stream, const char * format, ...);
【功 能】fscanf()会自参数stream 的文件流中读取字符串, 再根据参数format 字符串来转换并格式化数据。格式转换形式请参考scanf(). 转换后的结构存于对应的参数内。
fprintf()会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束(‘\0‘)为止。
【返回值】成功则返回输入/输出的字符个数, 失败则返回-1, 错误原因存于errno 中。
#include <stdio.h> int main(void){ int i = 150, j = -100; double k = 3.14159; fprintf(stdout, "%d %f %x \n", j, k, i); fprintf(stdout, "%2d %*d\n", i, 2, i); //这里中间的%*d <==> %2d,*被后面的2代替。 return 0; } 执行: -100 3.141590 96 150 150
#include <stdio.h> int main(void){ int i; unsigned int j; char s[5]; fscanf(stdin, "%d %x %5[a-z] %*s %f", &i, &j, s, s); /*%5[a-z]:表示只接受5个a到z中的字符,%*s:表示跳过下一个字输入的符串*/ printf("%d %d %s \n", i, j, s); } 执行: 10 0x1b aaaaaaaaa bbbbbbbbbb //从键盘输入 10 27 aaaaa
5、fread()/fwrite()
【原 型】size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);
【功 能】fread()从stream读取nitems个长度为size的数据到ptr所指向的缓冲区中。返回值是成功读到缓冲区中的记录个数。
fwrite()从ptr指向的缓冲区中读取nitems个长度为size到数据,并把它们写到stream所对应的文件中。
【说 明】stream为用fopen函数返回的文件结构指针。
#include <stdio.h> #include <stdlib.h> int main(void){ int data = 0; FILE *p_fin = NULL; FILE *p_fout = NULL; p_fin = fopen("file_in.txt", "r"); //以只读方式打开数据文件 if(NULL == p_fin){ printf("error"); exit(-1); } p_fout = fopen("file_out.txt", "w"); //以只写方式打开复制的新文件 if(NULL == p_fout){ printf("error"); exit(-1); } int r = 0; while((r = fread(&data, sizeof(char), 1, p_fin))) //读数据 fwrite(&data, sizeof(char), r, p_fout); //写数据 //关闭文件流 fclose(pfin); fclose(pfout); return 0; }
6、read()/write()