1 fopen
使用fopen
需要引用头文件stdio.h
,函数声明如下:
FILE *fopen(const char *pathname, const char *mode);
这里要多多关心的是第二个参数mode,关系到我们对文件操作的权限,这里做一个表格:
mode |
authority |
r |
read only(只读) |
r+ |
read and write(读写) |
w |
write(写,清除当前文件内容 或者 创建一个文件) |
w+ |
read and write(读写,如果文件不存在则创建,否则清除文件内容) |
a |
write(写,从文件末尾开始写内容,如果文件不存在就创建文件) |
a+ |
read and write(读写,从文件末尾开始写内容,如果文件不存在就创建文件) |
2 fread / fwrite
从文件流中读取指定数量的内容到缓冲区中
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
第二第三个参数可以理解为,一次读取size字节,总共读取nmemb次,返回值为实际读取到的数量。
FILE* pf = fopen("test.txt", "r");
char *p = (char*)malloc(21);
fread(p, 2, 10, pf);
p[20] = '\0';
printf("%s\n", p);
free(p);
如果读到文件末尾,fread返回的size为0
3 fgetc / fgets
读取一个字节的内容,除了使用上面的fread外,还可以使用fgetc,返回值是一个int(char);读取一行内容可以使用fgets,fgets的第二额参数为读取的最大数量。
int fgetc(FILE *stream); // getc
char *fgets(char *s, int size, FILE *stream);
以下是fgetc和fgets的使用示例:
FILE* pf = fopen("test.txt", "r");
char c = fgetc(pf);
printf("%c\n", c);
FILE* pf = fopen("test.txt", "r");
char *p = (char*)malloc(21);
char* pc = fgets(p, 20, pf);
printf("%s\n", pc);
4 getchar
getchar是从标准输入(stdin
)中读取数据,它会读到我们输入的所有内容,包括空格换行等。如果我们一次输入多个字符,它会逐个字符读取。
如果读到文件末尾,或者读取错误,fgetc / getc / getchar 的返回值为EOF,这是与fread不同的!!
char c;
while (c = getchar()) { // c = fgetc(stdin)
printf("%c", c);
}
/*
c // 输入c换行
c // getchar拿到c
// getchar拿到换行
*/
一般可以使用switch case来判断输入是否是我们想要的。
5 isspace / isblank …
这是一个系列方法,可以帮助我们判断读到的字符的特征,包括有如下方法,有需要可以man查看:
isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit
isupper / islower :判断字符的大小写
isdigit / isalnum :判断字符是否为0-9(阿拉伯数字)
isalpha :判断字符是否为字母
isblank :判断字符是否为空格(tab / space)
isspace :判断字符是否为空格(space、\f、\n,\r,\t,\v)
isxdigit :判断字符是否为十六进制数
6 fputc / fputs
fputc可以向指定流中写入一个字符;
fputs可以向指定流中写入一串字符;
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
以下是使用示例
const char *str = "Hello world!";
fputc('c', stdout);
fputc('\n', stdout);
fputs(str, stdout);
7 fseek / ftell
以文件流读取方法会按照从前向后的方式读取,如果我们想知道当前读取的位置,可以使用ftell;如果我们想指定文件读取的位置,可以使用fseek。
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
fseek第二个参数是偏移量,第三个参数由三个选择,会决定偏移量是从哪里开始偏移。
SEEK_SET:相对于头的偏移量
SEEK_CUR:相对于当前位置的偏移量
SEEK_END:相对于文件末尾的偏移量
读取的时候从偏移的下一位开始读。
fseek的offset可以是负数
FILE* pf = fopen("test.txt", "r"); // abcdefghijk
char c;
c = fgetc(pf);
printf("%c %ld\n", c, ftell(pf)); // a 1
fseek(pf, 3, SEEK_SET);
c = fgetc(pf);
printf("%c %ld\n", c, ftell(pf)); // d 4
fseek(pf, -2, SEEK_CUR);
c = fgetc(pf);
printf("%c %ld\n", c, ftell(pf)); // c 3
fseek(pf, -2, SEEK_END);
c = fgetc(pf);
printf("%c %ld\n", c, ftell(pf)); // j 10