全部博文(26)
2013年(26)
分类: C/C++
2013-09-24 11:06:40
系统调用I/O函数open,write,read,都是生成文件描述符,然后对文件描述符操作,比如:STDIN_FILENO,STDOUT_FILENO
标准I/O函数,则是由fopen,fgets,fputs,puts,gets,putc,getc,getchar,putchar,fprintf,fscanf等,生成文件指针,然后对文件指针操作,stdin,stdout
C语言的文件输入输出函数也是成对的,也就是说那些标准输入输出函数都有他的文件输入输出版本——fscanf和fprintf,fgets和fputs,getc和putc。
文件输入输出首先要使用的就是fopen(),他用来打开文件,然后对文件内容的读写就交给上面的几个函数处理。其函数原型为FILE * fopen(const char * path,const char * mode),第一个参数是一个字符串,即文件的路径,第二个参数指定文件的打开模式。常用的有:
"r"——打开文本文件,只读,该文件必须存在。
"w"——打开文本文件,可以写入新内容,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
"a"——打开文本文件,可以读取和写入。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
"r+"——打开可读写的文本文件,该文件必须存在。
"w+"——打开可读写的文本文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
"a+"——打开文本文件,可以读取和写入。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
fopen()返回一个文件指针,其他I/O函数调用这个参数。
fscanf()和fprintf()与scanf和printf()的工作方式相似。主要区别在于前两者需要在第一个参数来制定合适的文件,即fopen的返回的FILE指针。
例如我从一个文件读取数据,然后把数据写入另外一个文件中:
#include
#include
#include
#define max 100
int main() {
char *r = "E:/workspace/trying.txt";
char *w = "E:/workspace/test.txt";
FILE *read, *write;
char temp[max];
//打开文件流
read = fopen(r, "r");
write = fopen(w, "w");
// fscanf遇到空格和回车就停止下来,所以虽然可以复制文件内容,但是格式会有错误
while (fscanf(read, "%s", temp) == 1) {// 读字符串不推荐
fprintf(write, "%s", temp);
printf("%s", temp);
}
// 关闭文件流
if (fclose(read) == 0) {
printf("\nClose successfully");
}
if (fclose(write) == 0) {
printf("\nClose successfully");
}
return 0;
}
getc()和putc()是getchar()和putchar()对应的文件I/O函数,还是上面的例子,用这两个函数的实现如下:
#include
#include
#include
int main() {
char *r = "E:/workspace/trying.txt";
char *w = "E:/workspace/test.txt";
FILE *read, *write;
int c;
//打开文件流
read = fopen(r, "r");
write = fopen(w, "w");
// 可以完整的从文件复制内容和格式(换行回车都会保存)
while ((c = getc(read)) != EOF) {// 一个一个的读取字符
putc(c, write);// 写入文件
putchar(c);// 输出控制台
}
// 关闭文件流
if (fclose(read) == 0) {
printf("\nClose successfully");
}
if (fclose(write) == 0) {
printf("\nClose successfully");
}
return 0;
}
fgets()和fputs()是gets()和puts()对应的文件I/O函数。
fgets()和gets()的区别在于:
1.他需要第二个参数来说明最大读入字符数(这样就不会出现溢出的情况了,比gets()安全了很多),如果这个参数为n,fgets()就会读取最多n-1个字符或是读完一个换行符位置,由这两者中最先满足的那个决定。
2.fgets()会把读到的换行符也存到字符串中,而不是像gets()那样丢弃。
3.fgets()需要第三个参数指定读哪一个文件,从键盘读取时可以用“stdin”作为参数。
fputs()和puts()的区别在于:
1.和puts不同,fputs不会自动添加换行符(所以fgets()和fputs()配合的恰到好处)。
2.fputs()需要第二个参数指定读哪一个文件,从控制台输出时可以用“stdout”作为参数。
也是上面读写文件的例子,用这两个函数的实现方式就是:
#include
#include
#include
#define max 100
int main() {
char *r = "E:/workspace/trying.txt";
char *w = "E:/workspace/test.txt";
FILE *read, *write;
char temp[max];
//打开文件流
read = fopen(r, "r");
write = fopen(w, "w");
// 可以完整的从文件复制内容,fgets会把换行也存储在字符串中
while (fgets(temp, max, read) != NULL) {// 长度不够对于写文件没多大影响
fputs(temp, write);// fputs不会自动加换行
puts(temp);// puts会自动加换行
}
// 关闭文件流
if (fclose(read) == 0) {
printf("\nClose successfully");
}
if (fclose(write) == 0) {
printf("\nClose successfully");
}
return 0;
}