p57读写文件1
-
读写单个字符
-
fgetc 和 getc
-
参数: stream 该参数是一个 FILE 对象的指针,指定一个待读取的文件流
-
fputc 和 putc
int fputc(int c, FILE * stream); // c: 指定待写入的字符 // stream : 该参数是一个 FILE 对象的指针,指定一个待写入的文件流
现在让程序打开一个叫做"hello.txt"的文本文件,然后创建一个"fishc.txt"的文本文件,将"hello.txt"里面的内容写入到"fishc.txt"里面。
# include <stdio.h> # include <stdlib.h> int main(void){ FILE *fp1; FILE *fp2; // 我们要创建两个文件 int ch; if((fp1 = fopen("hello.txt","r")) == NULL) { printf("文件打开失败!\n"); exit(EXIT_FAILURE); } if((fp2 = fopen("fishc.txt","w")) == NULL) { printf("文件打开失败!\n"); exit(EXIT_FAILURE); } // 用一个while循环读取里面的每一个字符 while((ch = fgetc(fp1)) != EOF){ fputc(ch,fp2); } fclose(fp1); fclose(fp2); return 0; }
读写整个字符串
- fgets 和 fputs
- fgets 函数用于从指定文件中读取字符串。
- fgets 函数最多可以读取 size - 1 个字符,因为结尾处会自动添加一个字符串结束符 ‘\0’。当读取到换行符(‘\n’) 或文件结束符(EOF) 时,表示结束读取(‘\n’ 会被作为一个合法的字符读取)。
# include <stdio.h> char *fgets(char *s,int size, FILE *stram); s : 字符型指针,指向用于存放读取字符串的位置,读取的字符串存到s里面 size: 指定 读取的字符数(包括最后自动添加的'\0') stream : 该参数是一个FILE对象的指针,指定一个待操作的数据流 如果函数调用成功,返回s参数指向的地址
- fputs函数用于将一个字符串写入到指定的文件中,表示字符串结尾的’\0’不会被一并写入。
# include<stdio.h> int fputs(const char *s,FILE *stream); s : 字符型指针,指向用于存放待写入字符串的位置。 stream : 该参数是一个 FILE 对象的指针,指定一个待操作的数据流
先多次调用 fputs 函数,将几个字符串依次写入同一个文件中,调用fgets函数,在文件里读取,并把刚才写入的字符串打印到屏幕上。
# include <stdio.h> # include <stdlib.h> # define MAX 1024 int main(void){ FILE *fp; char buffer[MAX]; if((fp = fopen("lines.txt","w")) == NULL){ printf("打开文件失败!\n"); exit(EXIT_FAILURE); } fputs("Line one : Hello World!\n",fp); fputs("Line two: piao_piao\n",fp); fputs("Line three: CH-zN,line\n",fp); fclose(fp); /*把文件关闭,操作结束,这是写入部分。 写归写,读归读,程序才会有条理,如果没有关闭直接读取,这时候的位置指示器, 指向的是文件末尾,而且之前我们写入的字符串现在在缓冲区里面,还没有写入进去, 先关闭,落实到这三个字符串都写入到文件里面去了,然后再重新打开 */ if((fp = fopen("lines.txt","r")) == NULL){ printf("打开文件失败!\n"); exit(EXIT_FAILURE); } /* 字符串以EOF结尾,需要检测到末尾指示器(end-of-file indicator)被设置,没有被设置,返回值为 0, feof,如果被设置了,返回非 0 值*/ while(!feof(fp)){ fgets(buffer,MAX,fp); // 遇到换行符结束本次读取 printf("%s",buffer); /* 第三行打印两次: fgets 遇到换行或eof会结束本次字符串的读取, 在遇到第三行的换行符的时候,没有eof,认为本行字符串的读取结束,又进入了再一次的循环,这一次进去,整个文件剩下一个eof,只有eof而没有内容的时候,“如果还没读入任何字符就遇到eof,则s参数指向的位置保持原来的内容,函数返回NULL,” buffer 保留第三行,又打印出来了 */ } fclose(fp); return 0; }
-