Linux应用层学习——Day2(文件IO)
fopen
#include <stdio.h>int main(int argc,char const *argv[])
{// FILE *fopen (const char *__restrict __filename:字符串要打开的文件名称,// const char *__restrict __modes:打开的模式// 1) r:只读模式,如果没有文件报错// 2) w:只写模式 如果文件存在则清空文件,如果不存在则创建新文件// 3) a:只追加写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件// 4) r+: 读写模式 文件必须存在 写入是从头一个一个覆盖// 5) w+: 读写模式 如果不存在创建新文件// 6) a+:追加读写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件// return FILE * 结构体指针 表示一个文件// 报错返回 NULLchar *filename = "io.txt";//创建filename指针变量,指向io.txtFILE * ioFile = fopen(filename,"r");//FILE是C语言标准库stdio.h中定义的一个结构体,用于数据缓存,创建一个结构体指针if(ioFile == NULL){printf("failed");}else {printf("sucess");}return 0;
}
Makefile
CC:=gccfopen_test: fopen_test.c-$(CC) -o $@ $^-./$@-rm ./$@
CC:=gcc
的作用是把gcc变成变量CC,这样后面改只需要改一个CC
$@
是目标文件的名称,就是fopen_test
$^
代表所用依赖名,就是fopen_test.c、
-./$@
执行文件
-rm ./$@
删除文件
把读取模式换成写模式后,执行
fclose
#include <stdio.h>int main(int argc,char const *argv[])
{// FILE *fopen (const char *__restrict __filename:字符串要打开的文件名称,// const char *__restrict __modes:打开的模式// 1) r:只读模式,如果没有文件报错// 2) w:只写模式 如果文件存在则清空文件,如果不存在则创建新文件// 3) a:只追加写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件// 4) r+: 读写模式 文件必须存在 写入是从头一个一个覆盖// 5) w+: 读写模式 如果不存在创建新文件// 6) a+:追加读写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件// return FILE * 结构体指针 表示一个文件// 报错返回 NULLchar *filename = "io.txt";//创建filename指针变量,指向io.txtFILE* ioFile = fopen(filename,"w");//FILE是C语言标准库stdio.h中定义的一个结构体,用于数据缓存,创建一个结构体指针if (ioFile == NULL){printf("failed打开文件失败\n");}else {printf("打开成功\n");}//int fclose (FILE *__stream);//FILE *__stream:需要关闭的文件//return:成功返回0 失败返回EOF(负数),通常关闭失败直接报错int result = fclose(ioFile);if (result == EOF){printf("关闭文件失败\n");}else if (result == 0){printf("关闭文件成功\n");}return 0;
}
Makefile也需要写一下
CC:=gccfopen_test: fopen_test.c-$(CC) -o $@ $^-./$@-rm ./$@fclose_test: fclose_test.c-$(CC) -o $@ $^-./$@-rm ./$@
fputc
一次输入一个字节
#include <stdio.h>int main(int argc,char const *argv[])
{// FILE *fopen (const char *__restrict __filename:字符串要打开的文件名称,// const char *__restrict __modes:打开的模式// 1) r:只读模式,如果没有文件报错// 2) w:只写模式 如果文件存在则清空文件,如果不存在则创建新文件// 3) a:只追加写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件// 4) r+: 读写模式 文件必须存在 写入是从头一个一个覆盖// 5) w+: 读写模式 如果不存在创建新文件// 6) a+:追加读写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件// return FILE * 结构体指针 表示一个文件// 报错返回 NULLchar *filename = "io.txt";//创建filename指针变量,指向io.txtFILE* ioFile = fopen(filename,"w");//FILE是C语言标准库stdio.h中定义的一个结构体,用于数据缓存,创建一个结构体指针if (ioFile == NULL){printf("failed打开文件失败\n");}else {printf("打开成功\n");}//int fputc (int __c, FILE *__stream);//int __c:ASCII码对应的char//FILE *__stream :打开的一个文件//return: 成功返回char 失败返回 EOFint put_result = fputc(97,ioFile);if (put_result == EOF){printf("写入文件失败\n");}else{printf("写入%c成功\n",put_result);}//int fclose (FILE *__stream);//FILE *__stream:需要关闭的文件//return:成功返回0 失败返回EOF(负数),通常关闭失败直接报错int result = fclose(ioFile);if (result == EOF){printf("关闭文件失败\n");}else if (result == 0){printf("关闭文件成功\n");}return 0;
}
Makefile也需要写一下,要注意顺序,应该是先打开,然后写入,然后关闭
CC:=gccfopen_test: fopen_test.c-$(CC) -o $@ $^-./$@-rm ./$@fputc_test: fputc_test.c-$(CC) -o $@ $^-./$@-rm ./$@fclose_test: fclose_test.c-$(CC) -o $@ $^-./$@-rm ./$@
fputs
这里和fputc的区别就是fputs是输进去字符串的
//int fputs (const char *__restrict __s, FILE *__restrict __stream);// const char *__restrict __s:需要写入的字符串//FILE *__restrict __stream:需要写入的文件//return:成功返回非负整数,一般是0和1 失败返回EOFint putsR = fputs("love letter\n",ioFile);if(putsR == EOF){printf("写入字符串失败\n");}else{printf("写入字符串%d成功\n",putsR);}
Makefile
CC:=gccfopen_test: fopen_test.c-$(CC) -o $@ $^-./$@-rm ./$@fputc_test: fputc_test.c-$(CC) -o $@ $^-./$@-rm ./$@fputs_test: fputs_test.c-$(CC) -o $@ $^-./$@-rm ./$@fclose_test: fclose_test.c-$(CC) -o $@ $^-./$@-rm ./$@
fprintf
// fprintf (FILE *__restrict __stream, const char *__restrict __fmt, ...)//FILE *__restrict __stream:打开的文件 这次是先写要打开的文件//char *__restrict __fmt:带格式化的长字符串//...可变参数:填入格式化的长字符串//return: 成功返回写入的字符个数 不包含换行符 失败返回EOFchar *name = "叮咚鸡";int printfR = fprintf(ioFile,"这是输入的内容\n这里是第二行\n这里是最后一行\n \n\t\t %s",name);if(printfR == EOF){printf("字符串写入失败\n");}else{printf("字符串%d写入成功",printfR);}
Makefile
fprintf_test: fprintf_test.c-$(CC) -o $@ $^-./$@-rm ./$@
fgetc
读取文件的单个字节
因为中文是按照utf-8编码,3个字节组成一个字,所以按照一个一个读取的方式,只能去读英文单个字符,但是如果只按照printf的方式去输出的话,是会出现乱码的,所以只能采取循环的形式去读
#include<stdio.h>int main(int argc,char const *argv[])
{FILE * ioFile = fopen("io.txt","r");if(ioFile == NULL){printf("无法读取此文件,文件不存在\n");}else{printf("已读取文件\n");}//int fgetc (FILE *__stream);//FILE *__stream:打开的文件//return:读取到的1个字节 如果没读取到或者是文件末尾则EOFchar c = fgetc(ioFile);while(c != EOF){ printf("%c",c);c = fgetc(ioFile);}printf("\n");int closeR = fclose(ioFile);if(closeR == EOF){printf("关闭文件失败\n");}else if(closeR == 1){printf("成功关闭文件\n");}return 0;
}
Makefile
fgetc_test: fgetc_test.c-$(CC) -o $@ $^-./$@-rm ./$@