C语言的输入输出流基本函数
文件的打开与关闭
C 程序中对任何文件进行操作,都必须先“打开”文件,即打开流;操作完成后,需“关闭”文件,即关闭流。
这里的“打开”和“关闭”可调用标准库 stdio.h 中的 fopen 和 fclose 函数实现。
打开函数 fopen 和关闭fclose的原型如下。
FILE * fopen(char *filename, char *mode);//打开流
int fclose(FILE *fp);//结束操作后要记得关闭流
函数参数:
filename:文件名,包括路径,如果不显式含有路径,则表示当前路径。例如,“D:\f1.txt”表示 D 盘根目录下的文件 f1.txt 文件。“f2.doc”表示当前目录下的文件 f2.doc。
mode:文件打开模式。
文件的顺序读写
对文件读取操作完成后,如果从文件中读取到的每个数据的顺序与文件中该数据的物理存放顺序保持一致,则称该读取过程为顺序读取;同理,对文件写入操作完成后,如果文件中所有数据的存放顺序与各个数据被写入的先后顺序保持一致,则称该写入过程为顺序写入。
首先要知道的两个filename为stdin和stdout。
stdin表示从键盘中读取到的数据,也就是在命令行中输入的数据。
stdout表示将数据输出到屏幕前,也就是在命令行中输出。
字符流按数据类型分为字符数据流和字节数据流。
c 语言中提供了从文件中逐个输入字符及向文件中逐个输出字符的顺序读写函数 fgetc 和 fputc 及调整文件读写位置到文件开始处的函数 rewind。这些函数均在标准输入输出头文件 stdio.h 中。
int fgetc (FILE *fp);//读操作
int fputc (int c, FILE *fp);//写操作
void rewind (FILE *fp);//复位,让指针指向该文件的开始
int fseek ( FILE *fp, long offset, int origin );// 用来将位置指针移动到任意位置
fgetc后面为c就表示着一次只能就是一个字符的意思。
值得注意的是返回类型时int,该返回的int为表示字符的编码,
如果在读取文件时已经读完了将返回-1
写操作fputc,c为f要写入的字符.输出成功返回c,输出失败则返回-1。
要注意的是stdout在写入的时候不要输出别的语句,因为输出后stdout的指针没有发生改变,仍然指向原位置,而输出了别的字符,这样会缓存区发生冲突导致乱码。
fseek:
offset参数表示偏移的字节数
origin参数,文件开头SEEK_SET 0,当前位置SEEK_CUR 1,
文件末尾SEEK_END 2
#include<stdio.h>
#include<stdlib.h>
int main (void){
//创建一个文件事例
FILE *file1=NULL;
char file_name[20]="D:/测试输入文件.txt";
file1=fopen(file_name,"w");
if(file1==NULL){
printf("file not found!");
exit(0);
}
// fgetc和fputc例子
int num=0;
while((num=fgetc(stdin))!='\n') {
fputc(num,stdout);
}
fclose(file1);//记得关闭流
}
//输出结果为输入什么就输出什么
文件复制实现
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 20
int main (){
char file_name[20]="D:/c_test.txt";
char new_file[20]="D:/target.txt";
FILE *fp=fopen(file_name,"r");
FILE *tar=fopen(new_file,"w");
if(fp==NULL){
puts("Failed to open the file!");
exit(0);
}
int num=0;
while((num=fgetc(fp))!=-1){
fputc(num,tar);
}
fclose(fp);
fclose(tar);
}
字符串输入输出
字符串本质就是字符数组char[];
char * fgets (char *s, int size, FILE * fp);//读操作
/*
函数功能:从 fp 所指向的文件内,读取若干字符(一行字符串),并在其后自动
添加字符串结束标志 '\0' 后,存入 s 所指的缓冲内存空间中(s 可为字符数组
名),直到遇到回车换行符或已读取 size-1 个字符或已读到文件结尾为止。该函
数读取的字符串最大长度为 size-1。
*/
int fputs (const char *str, FILE *fp);//写操作
/*
函数功能:把 str(str 可为字符数组名)所指向的字符串,输出到 fp 所指的文
件中。
*/
例:
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 20
int main (){
FILE *fp=fopen("D:/c_test.txt","w+");//读写
if(fp==NULL){
puts("Failed to open the file!");
exit(0);
}
char str[MAX_SIZE];//定义缓存数组
fgets(str,MAX_SIZE,stdin);
fputs(str,fp);
fgets(str,MAX_SIZE,stdin);
fputs(str,fp);
rewind (fp); // fp指向文件开始
while(fgets(str,MAX_SIZE,fp)!=NULL){//输出文件数据
fputs(str,stdout);
}
fclose(fp);
}
格式化输入输出的读写操作
int fscanf ( FILE *fp, char * format, ... );
int fprintf ( FILE *fp, char * format, ... );
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 20
int main (){
char file_name[20]="D:/c_test.txt";
FILE *fp=fopen(file_name,"w+");
if(fp==NULL){
puts("Failed to open the file!");
exit(0);
}
char s[10];
fprintf(fp,"%s",file_name); //写入信息到流中
rewind (fp);
fscanf(fp,"%s",s);//从流中读取信息
printf("%s",s);
// fscanf(stdin,"%s",s);从键盘读取信息
//fprintf(stdout,"%s",s); 输出值到屏幕
fclose(fp);
}