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 * 结构体指针 表示一个文件
// 报错返回 NULL
char *filename = "io.txt";//创建filename指针变量,指向io.txt
FILE * ioFile = fopen(filename,"r");//FILE是C语言标准库stdio.h中定义的一个结构体,用于数据缓存,创建一个结构体指针
if(ioFile == NULL)
{
printf("failed");
}
else {
printf("sucess");
}
return 0;
}
Makefile
CC:=gcc
fopen_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 * 结构体指针 表示一个文件
// 报错返回 NULL
char *filename = "io.txt";//创建filename指针变量,指向io.txt
FILE* 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:=gcc
fopen_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 * 结构体指针 表示一个文件
// 报错返回 NULL
char *filename = "io.txt";//创建filename指针变量,指向io.txt
FILE* 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 失败返回 EOF
int 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:=gcc
fopen_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 失败返回EOF
int putsR = fputs("love letter\n",ioFile);
if(putsR == EOF)
{
printf("写入字符串失败\n");
}else{
printf("写入字符串%d成功\n",putsR);
}
Makefile
CC:=gcc
fopen_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: 成功返回写入的字符个数 不包含换行符 失败返回EOF
char *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个字节 如果没读取到或者是文件末尾则EOF
char 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 ./$@