Linux 文件操作-标准IO函数2- fopen、fclose、fgetc、fputc、fgets、fputs验证

目录

 1.fopen 打开文件

1.1 只读打开文件,并且文件不存在

1.2 只写打开文件,并且文件不存在

1.3 只写打开文件,并且文件存在,且有内容

1.4 追加只写打开文件,并且文件不存在

2. fclose 关闭文件

3. fgetc 读取一个字符

4.fputc 写入一个字符

5.fgets 从文件中读取一行字符串

(1)读取的字节数小于文件一行内容,提前结束读取

(2)读取的字节数小于文件一行内容,提前结束读取

6.fputs 向文件写入一个字符串


 1.fopen 打开文件

函数原型:

/* 功能:创建或者打开一个文件
参数:
path:文件名,如果只写文件名,默认就是当前路径,也可以添加路径
mode:文件权限
r 只读打开:如果文件不存在则报错,文件存在只读打开
r+ 读写打开,如果文件不存在则报错,文件存在读写打开
w 只写打开,如果文件不存在则创建;如果文件存在则清空,只写打开;
w+ 读写打开,如果文件不存在则创建;如果文件存在则清空,读写打开
a 追加只写打开,如果文件不存在则创建;如果文件存在直接追加,只写打开
a+ 追加读写打开,如果文件不存在则创建;如果文件存在则追加读写打开

 返回值:
 成功:文件指针
 失败:NULL */
FILE *fopen(const char *path, const char *mode);

1.1 只读打开文件,并且文件不存在

程序:

#include <stdio.h>

int test1()
{
	//使用fopen函数打开或者创建文件,返回文件指针
    FILE *fp = NULL;
	//以只读的方式打开文件,如果文件不存在则报错
    fp = fopen("./file.txt", "r");
     if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }

    //使用fclose关闭文件
    fclose(fp);
}

int main(int argc, char *argv[])
{
    test1(fp);
	
    return 0;
}

运行结果:

1.2 只写打开文件,并且文件不存在

程序:

#include <stdio.h>

int test2()
{
	//使用fopen函数打开或者创建文件,返回文件指针
    FILE *fp = NULL;
	 //以只写的方式打开文件,如果文件不存在则创建,如果文件存在清空
    fp = fopen("./file.txt", "w");
     if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }
    
    //使用fclose关闭文件
    fclose(fp);
}

int main(int argc, char *argv[])
{    
    test2();

    return 0;
}

运行结果:

1.3 只写打开文件,并且文件存在,且有内容

程序:与3.2只写打开文件,并且文件不存在,程序相同

运行结果:

1.4 追加只写打开文件,并且文件不存在

程序:

#include <stdio.h>

int test3()
{
	//使用fopen函数打开或者创建文件,返回文件指针
    FILE *fp = NULL;
	//以只写的方式打开文件,如果文件不存在则创建,文件存在则追加
    fp = fopen("./file.txt", "a");
   
     if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }
    
    //使用fclose关闭文件
    fclose(fp);
}

int main(int argc, char *argv[])
{
    
    test3();

    return 0;
}

运行结果:

2. fclose 关闭文件

/*
功能:关闭一个文件指针,无法在对当前文件进行操作
参数:
stream:指定的文件指针,fopen函数的返回值

返回值:
成功:0
失败:EOF

注意:注意一个文件只能关闭一次,不能多次关闭。
关闭文件之后就不能再文件指针对文件进行读写等操作了。
*/
int fclose(FILE *stream);

程序:见fopen 打开文件,程序最后。

3. fgetc 读取一个字符

函数原型:

 /* 功能:从文件指针标识的文件中读取一个字符
 参数:stream:指定的文件指针

 返回值:
 成功:读取的字符
 失败:EOF
 如果文件读取完毕,也会返回EOF */

int fgetc(FILE *stream);

程序:

#include <stdio.h>

int test1()
{
	 FILE *fp = NULL;
    fp = fopen("./file.txt", "r");
    if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }
    
    //使用fgetc从文件中读取一个字符
   int c = fgetc(fp);
    printf("c = [%c] - %d\n", c, c);
    printf("test1 end \n");
 	 	
    return 0;
}

int main(int argc, char *argv[])
{
    FILE *fp = NULL;
    fp = fopen("./file.txt", "r");
    if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }

    //文件的每一行结束的位置都有一个标识,是一个换行符,称之为行结束符
    //fgetc可以读取到行结束符
    int c;
    while((c = fgetc(fp)) != EOF)
    {
        printf("c = [%c] - %d  ", c, c);
    }

	printf(" \ntest1 start \n");
	test1();

    fclose(fp);  	 	
    return 0;
}

运行结果:

4.fputc 写入一个字符

函数原型:

 /* 功能:向文件指针标识的文件中写入一个字符
 参数:
 c:要写入的字符
 stream:指定的文件指针

 返回值:
 成功:要写入的字符
 失败:EOF */
int fputc(int c, FILE *stream);

程序:

#include <stdio.h>

int test1()
{
	FILE *fp = NULL;
	//只写打开./file.txt,不存在则创建文件,文件存在则清空
    fp = fopen("./file.txt", "w");
    if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }

	int i;
   //通过fputc函数向文件写入一个字符
    i = fputc('h', fp);
    i = fputc('e', fp);
    i = fputc('l', fp);
    i = fputc('\n', fp);
    i = fputc('l', fp);
    i = fputc('o', fp);
    if(i ==  EOF)
    {
	printf("fail to fputc\n");
	return -1;
    }

	fclose(fp);  	 	
    return 0;
}

int main(int argc, char *argv[])
{
   
	test1();
    return 0;
}

运行结果:

5.fgets 从文件中读取一行字符串

函数原型:

 /* 功能:从文件中读取内容
参数:
s:保存读取到的内容
size:每次读取的最大个数
stream:文件指针

返回值:
成功:读取的数据的首地址
失败:NULL
 如果文件内容读取完毕,也返回NULL

 注意:从stream所指的文件中读取字符,在读取的时候碰到换行符或者是碰
 到文件的末尾停止读取,或者是读取了size‐1个字节停止读取,在读取
 的内容后面会加一个\0,作为字符串的结尾 */
char *fgets(char *s, int size, FILE *stream);

(1)读取的字节数小于文件一行内容,提前结束读取

程序:

#include <stdio.h>

//fgets读取的字节数大于文件一行内容,碰到 换行符 \n 提前结束读取
int test1() 
{
	FILE *fp = NULL;
    fp = fopen("./file.txt", "r");
    if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }

    //使用fgets读取文件内容
    //fgets每次读取时最多读取文件一行内容,只要遇到行结束符就立即返回
   char buf[32] = {0};
   
   //从fp里读取32个字节到buf
    fgets(buf, 32, fp);
    printf("buf = %s\n", buf);
    printf("test1 end \n");
 	 	
    return 0;
}


int main(int argc, char *argv[])
{
 
	printf("test1 start \n");
	test1();

    fclose(fp);  	 	
    return 0;
}

运行结果:

(2)读取的字节数小于文件一行内容,提前结束读取

程序:

#include <stdio.h>

//fgets读取的字节数小于文件一行内容,提前结束读取 
int test2() 
{
	FILE *fp = NULL;
	//file.txt内容 0123459789abcdefghijABCDEFGHIJ
    fp = fopen("./file.txt", "r");
    if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }

    //使用fgets读取文件内容
    //fgets每次读取时最多读取文件一行内容,只要遇到行结束符就立即返回
   char buf[32] = {0};
   
   //从fp里读取15个字节到buf
    fgets(buf, 15, fp);
    printf("buf = %s\n", buf);
    printf("test2 end \n");
 	 	
    return 0;
}

int main(int argc, char *argv[])
{
 
	printf("test2 start \n");
	test2();

    fclose(fp);  	 	
    return 0;
}

运行结果:

6.fputs 向文件写入一个字符串

函数原型:

 /* 功能:向文件写入数据
 参数:
 s:要写入的内容
 stream:文件指针

 返回值:
 成功:写入文件内容的字节数
 失败:EOF */
int fputs(const char *s, FILE *stream);

程序:

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp = NULL;
    fp = fopen("./file.txt", "w");
    if(fp == NULL)
    {
        printf("fail to fopen\n");
        return -1;
    }

    //通过fputs函数向文件写入数据
    fputs("0123459789\n", fp);
    fputs("ABCDEFGHIJ", fp);
    fputs("9876543210", fp);

    fclose(fp);  	 	
    return 0;
}

运行结果:

file.txt内容: