c语言中 gets puts,C语言的文件输入输出 getc putc gets puts fgets puts fscanf fprintf

系统调用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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值