嵌入式应用开发学习笔记——标准IO
文件指针
“文件指针”是缓冲文件系统的一个重要概念,在C系统的头文件stdio.h中定义了一个名叫FILE的结构体类型:
typedef struct
{
short level; //缓冲区饱和程度
unsigned flage; //文件状态标志
char fd; //文件号
unsigned char hold; //无缓冲区取消字符输入
short bsize; //缓冲区大小,缺省值512
unsigned char *buffer; //缓冲区
unsigned char *curp; //当前活动指针
unsigned istemp; //草稿文件标识
short token; //作正确性检验
}FILE;
库函数——创建和打开
FILE *fopen(const char *filename, const char *mode)
filename:
打开的文件名(包含路径,缺省为当前路径)
mode:
打开模式
返回值:成功打开返回FILE指针,失败返回NULL
常见打开模式:
r, rb 只读方式打开
w, wb 只写方式打开,如果文件不存在,则创建该文件
a, ab 追加方式打开,如果文件不存在,则创建该文件
r+, r+b, rb+ 读写方式打开
w+, w+b, wh+ 读写方式打开,如果文件不存在,则创建该文件
a+, a+b, ab+ 读和追加方式打开,如果文件不存在,则创建该文件
注意:b用于区分二进制文件和文本文件,这一点在DOS、Windows系统中是有区分的,但linux不区分二进制文件和文本文件
1 #include <stdio.h>
2 #include <errno.h>
3 #include <stdlib.h>
4
5 int main(void)
6 {
7 FILE *fp;
8 fp = fopen("test.txt", "r");
9 if(fp == NULL)
10 {
11 perror("fopen");
12 exit(1);
13 }
14 printf("success open the file\n");
15 if(fclose(fp) == EOF)
16 {
17 perror("fclose");
18 exit(1);
19 }
20 return 0;
21 }
库函数——读写
size_t fread(void *ptr, size_t size, size_t n, FILE *stream)
功能:从stream指向的文件中读取n个字段,每个字段为size个字节,并将读取的数据放入ptr所指的字符数组中,返回实际已读取的字节数
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream)
功能:从缓冲区ptr所指的数组中把n个字段写到stream指向的文件中,每个字段长为size个字节,返回实际写入的字段数
提示:返回0时,使用feof或者ferror函数判断原因
1 #include <stdio.h>
2 #include <string.h>
3 #include <errno.h>
4 #include <stdlib.h>
5
6 int main(void)
7 {
8 int readnum;
9 FILE *fp;
10 char buf[1024];
11 fp = fopen("test.txt", "r");
12 if(fp == NULL)
13 {
14 perror("fopen");
15 exit(1);
16 }
17
18 readnum = fread(buf, sizeof(char), 1024, fp);
19 if(readnum > 0)
20 {
21 printf("fread:%s\n", buf);
22 return 0;
23 }
24 if(feof(fp))
25 {
26 printf("read file end\n");
27 return 0;
28 }
29 perror("fread");
30 exit(1);
31 }
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <string.h>
5
6 int main(void)
7 {
8 FILE *fp;
9 int writenum;
10 char buf[100];
11 fp = fopen("test.txt", "w");
12 if(fp == NULL)
13 {
14 perror("fopen");
15 exit(1);
16 }
17
18
19 memset(buf, 0, sizeof(buf));
20 strcpy(buf, "this is second test file for fwrite\n");
21 writenum = fwrite(buf, sizeof(char), strlen(buf), fp);
22 if(writenum > 0)
23 {
24 fclose(fp);
25 printf("write ok\n");
26 system("cat test.txt");
27 return 0;
28 }
29 perror("fwrite");
30 exit(1);
31
32 }
int fgetc(FILE *stream)
从指定的文件中读一个字符
返回值:返回字符,文件结尾、错误返回EOF, 使用ferror判断
char *fgets(char *s, int size, FILE *stream)
从指定的文件中读取size-1个字符到s中,返回s的首地址
int getc(FILE *stream)
int getchar(void) (getc(c, stdin))
char *gets(FILE *stream)
int fputc(int c, FILE *stream)
向指定的文件中写入一个字符
int fputs(const char *s, FILE *stream)
向指定的文件中写入一个字符串,成功返回0,不成功返回非0
int putc(int c, FILE *stream);
int putchar(void) (putc(c, stdout));
int puts(const char *s);
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main(void)
5 {
6 FILE *fp;
7 char ch;
8 if((fp = fopen("test.txt", "r")) == NULL)
9 {
10 perror("fopen");
11 exit(1);
12 }
13 ch = fgetc(fp);
14 while(ch != EOF)
15 {
16 putchar(ch);
17 ch = fgetc(fp);
18 }
19 fclose(fp);
20
21 return 0;
22 }
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <string.h>
5
6 int main(void)
7 {
8 FILE *fp1;
9 FILE *fp2;
10
11 int readnum = 0;
12 int writenum = 0;
13 char buf[1024];
14 int i;
15
16 fp1 = fopen("test.txt", "r");
17 fp2 = fopen("1.txt", "w+");
18
19 if((fp1 == NULL) || (fp2 == NULL))
20 {
21 perror("fopen");
22 exit(1);
23 }
24
25 memset(buf, 0, sizeof(buf));
26
27 readnum = fread(buf, sizeof(char), 1024, fp1);
28 if(readnum > 0)
29 {
30 for(i = 0; i < readnum; i++)
31 {
32 fputc(buf[i], fp2);
33 }
34 }
35
36 fclose(fp1);
37 fclose(fp2);
38
39 return 0;
40 }
库函数——定位
int fseek(FILE *stream, long offset, int whence)
whence:
SEEK_SET 从文件的开始处开始搜索
SEEK_CUR 从当前位置开始搜索
SEEK_END 从文件的结束处开始搜索
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <errno.h>
5
6 int main(void)
7 {
8 FILE *fp;
9 char buf[1024];
10
11 if((fp = fopen("test.txt", "r+")) == NULL)
12 {
13 perror("fopen");
14 exit(1);
15
16 }
17 memset(buf, 0, sizeof(buf));
18 fgets(buf, 1024, fp);
19 printf("%s\n", buf);
20
21 fseek(fp, 0, SEEK_SET);
22
23 memset(buf, 0, sizeof(buf));
24 strcpy(buf, "this is fgets fputs test, we use fseek function");
25
26 fputs(buf, fp);
27 fclose(fp);
28
29 return 0;
30 }
库函数——格式化读写
fscanf(FILE *stream, char *format[, argument…])
从一个流中进行格式化输入
int fprintf(FILE *stream, char *format[, argument…])
格式化输出到一个流中
1 #include <stdio.h>
2 #include <errno.h>
3 #include <stdlib.h>
4
5 int main(void)
6 {
7 FILE *fp;
8 int i[2] = {0};
9 int k = 0;
10 if((fp = fopen("num.txt", "r")) == NULL)
11 {
12 perror("fopen");
13 exit(1);
14 }
15 for(k = 0; k < 2; k++)
16 {
17 fscanf(fp, "%d", &i[k]);
18 printf("get the number is %d\n", i[k]);
19 }
20 return 0;
21 }
路径获取
在编写程序的时候,有时候需要得到当前路径,C库函数提供了getcwd来解决这个问题。
char *getcwd(char *buffer, size_t size)
我们提供一个size大小的buffer, getcwd会把当前的路径名copy到buffer中,如果buffer太小,函数会返回-1。
创建目录
#include <sys/stat.h>
int mkdir(char *dir, int mode)
功能:创建一个新目录
返回值:0表示成功,-1表示出错。
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4 #include <sys/stat.h>
5
6 int main(void)
7 {
8 char buf[80];
9
10 getcwd(buf, 80);
11 printf("pwd = %s\n", buf);
12
13 strcat(buf, "/test");
14 mkdir(buf, 0777);
15
16 if(!access(buf, F_OK))
17 {
18 printf("directory create ok\n");
19 }
20
21 return 0;
22 }