ggg
linux中一切皆文件,对文件的操作步骤分为三步
1.打开2.读写3.关闭
标准IO库 ---- stdio中有对应的函数
1.打开
fopen
2.读写
fgetc/fputc
fgets/fputs
fread/fwrite
一切皆文件的思想简化linux对文件的处理,可以使用统一的操作逻辑
fopen
打开文件
头文件
#include <stdio.h>
函数原型
FILE *fopen(const char *path, const char *mode);
说明:参数 path 字符串包含欲打开的文件路径及文件名,参数 mode 字符串则代表着文本流的形态,有下列几种形态字符串。(path为要打开的文件名【一般为argv数组元素】,mode是打开的模式)
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则建立该文件。
a 以附加的方式打开只写文件,若文件不存在,则会建立该文件;若文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件,若文件不存在,则会建立该文件;若文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
返回值:文件顺利打开后,指向该流的文件指针就会被返回。若文件打开失败则返回 NULL,并把错误代码存在 errno 中。
1 #include<stdio.h>
2 #include<fcntl.h>
3
4
5 int main(int argc, const char *argv[])
6 {
7 if (argc != 2) {
8 printf(" %s <file>\n", argv[0]);
9 return 1;
10 }
11 FILE*pf=fopen("argv[1]","w");
12 if(pf==NULL)
13 {
14 perror("fopen fail\n");
15 return -1;
16 }else
17 {
18 printf("yes\n");
19 }
20
21 return 0;
22 }
~
fgetc
int fgetc(FILE * stream);
1 #include<stdio.h>
2 #include<fcntl.h>
3
4 // ./a.out 1.txt
5 int main(int argc, const char *argv[])
6 {
7 FILE*pf=fopen("1.txt","r");
8 if(pf==NULL)
9 {
10 perror("fopen fail\n");
11 return -1;
12 }else
13 {
14 printf("yes\n");
15 }
16 int ret=fgetc(pf);
17 printf("ret = %c:%d",ret,ret);
18
19 return 0;
20 }
#include<stdio.h>
int main() //cat
{
FILE *fp;
int c;
fp=fopen("exist", "r");
while((c = fgetc(fp)) != EOF)
printf("%c", c);
fclose(fp);
}
fgets
char * fgets(char * s,int size,FILE * stream);
实现cat功能并输出文件行数(利用读取到'/n'fgets会结束的情况【'\n'保留在ret字符串中】)
1 #include<stdio.h>
2 int main(int argc, const char *argv[])
3 {
4 FILE*p=fopen("fgetc.c","r");
5 char ret[1024];
6 int cnt=0;
7 while(1)
8 {
9 if(fgets(ret,1024,p)==NULL)
10 break;
11 printf("%s",ret);
12 cnt++;
13 }
14 putchar('\n');
15 printf("cnt = %d\n",cnt);
16 return 0;
17 }
读取结束的情况:
1.读到文件末尾EOF
2.读取到\n说明:\n会被保存到buffer中
3.读取到size-1字符(fgets中的参数,最后会补上'\0')
fputc
int fputc(int c,FILE * stream);
说明:fputc 会将参数 c 转为 unsigned char 后写入参数 stream 指定的文件中。
1 #include<stdio.h>
2 int main(int argc, const char *argv[])
3 {
4 if (argc < 2) {
5 printf("用法: %s <文件名>\n", argv[0]);
6 return 1;
7 }
8 FILE*p=fopen(argv[1],"r");
9 int ret=fgetc(p);
10 while(ret!=EOF)
11 {
12 fputc(ret,stdout);
13 ret = fgetc(p);
14 }
15 return 0;
16 }
默认打开文件(in、out、err)
系统默认打开有三个文件
名称 文件描述符(FD)
stdin 0
stdout 1
stderr 2
stdout与stderr类似,都是输出到屏幕(终端),不过为了性能考虑,stdout有缓冲区,达到一定条件才输出,在系统崩溃的情况下stdout没来得及输出就会被清零,而stderr没有缓冲区,避免了上述情况。
stdin默认从键盘上取数据,总的来说就是从外界得到数据,不局限于键盘
fputs
int fputs(const char * s, FILE * stream);
#include <stdio.h>
int main()
{
char s[80];
fputs(fgets(s,80,stdin),stdout);
}
fwrite
size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);
说明:fwrite() 用来将数据写入文件流中。参数 stream 为已打开的文件指针,参数 ptr 指向欲写入的数据地址,总共写入的字符数以参数 size*nmemb 来决定。fwrite() 会返回实际写入的 nmemb 数目。
#include <stdio.h>
#define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}
#define nmemb 3
struct test
{
char name[20];
int size;
}s[nmemb];
int main()
{
FILE * stream;
set_s(0, "Linux!");
set_s(1, "FreeBSD!");
set_s(2, "Windows2000.");
stream = fopen("/tmp/fwrite", "w");
fwrite(s, sizeof(struct test), nmemb, stream);
fclose(stream);
return 0;
}
fread
size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);
说明:fread() 用来从文件流中读取数据。参数 stream 为已打开的文件指针,参数 ptr 指向欲存放读取进来的数据空间,读取的元素大小与个数 size和nmemb 来决定。fread() 会返回实际读取到的 nmemb 数目,如果此值比参数 nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用 feof() 或 ferror() 来决定发生什么情况。(size_t是无符号类型,返回值不会是负数,当返回值比nmemb小时通过ferror查看运行情况)
#include <stdio.h>
#define nmemb 3
struct test
{
char name[20];
int size;
}s[nmemb];
int main()
{
FILE * stream;
int i;
stream = fopen("/tmp/fwrite", "r");
fread(s, sizeof(struct test), nmemb, stream);
fclose(stream);
for(i=0; i<nmemb; i++)
printf("name[%d]=%-20s:size[%d]=%d\n", i, s[i].name, i, s[i].size);
return 0;
}
fclose
int fclose(FILE * stream);
说明:fclose() 用来关闭先前 fopen() 打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。
返回值:若关文件动作成功则返回 0,有错误发生时则返回 EOF 并把错误代码存到 errno。
1 #include<stdio.h>
2 #include<fcntl.h>
3
4
5 int main(int argc, const char *argv[])
6 {
7 if (argc != 2) {
8 printf(" %s <file>\n", argv[0]);
9 return 1;
10 }
11 FILE*pf=fopen("argv[1]","w");
12 if(pf==NULL)
13 {
14 perror("fopen fail\n");
15 return -1;
16 }else
17 {
18 printf("yes\n");
19 }
20 fclose(pf);
21 return 0;
22 }
~