文件操作相关知识

1.文件的打开与关闭:

运用到关键字:fopen和fclose,还有文件指针(eg:FILE* pf)

文件指针:用来存储该文件的一个地址,通过该指针可以找到该文件,是用来操作与维护流的

打开时需用fopen是需要判断文件是否打开成功,否则一旦没有打开成功会出现会空指针异常(文件打开失败,返回NULL),并且该文件必须在该目录下被创建,否则是一定会出现空指针异常的。

关闭时需将创建的文件指针进行置为NULL的操作(否则会出现野指针)。

例如:

int main()
{
    //这里表示对文件进行写的操作,还可以进行的只读的的操作
    FILE* pf1 = fopen("test.txt", "w");
    //如果pf1为空的话,表示打开test.txt文件失败
    if(pf1 == NULL)
    {
        perror("fopen");
        return 1;
    }  
    
    //写文件
    //此处省略

    //关闭文件
    fclose(pf1);
    pf1 = NULL;
    return 0;
}

(1)文件打开时的基础操作:

 2.文件标准流

stdin      ——标准输入流

stdout    ——标准输出流

stderr     ——标准错误流

c程序在启动是就会默认打开这三个流。可以直接使用printf,scanf进行输入输出操作

3.文件的顺序读写函数:

(1)fpetc与fgutc

返回类型为int,当读取或写入失败时,会返回EOF。

1)fputc:int fputc(int chracter,FILE* stream)

将一个字符(注意该字符是用ASCII码值存储的,得用int类型来存储)写入到stream所指向的文件流中去,它是字符输出函数 => 所有输出流

eg:

#include <stdlib.h>
int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

    //写文件:写入abcd
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

2)fgetc:int fgetc(FLIE* stream)

读取文件的一个文件的第一个字符,如果返回值不为EOF,则可以继续读取直到读取失败返回EOF,它是字符输入函数 => 所有输入流

eg:

#include <stdio.h>
//此时test.txt文件中已写入abcd
int main()
{
    //打开文件
    FILE* pf = fopen("test.txt", "r");
    if(pf == NULL)
    {
        perror("fopen");
        return 1;
    }

    //读文件
    int ch = 0;
    while((ch = fgetc()) != EOF)
    {
        printf("%c ", ch);        //打印a b c d
    }
        
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
    
}

(2)fputs与fgets

1)fputs:int fputs(const char* str, FILE* stream)

将一个字符串写入到stream文件流中去,它是文本行输出函数 => 所有输出流

eg:

//假设已清空test.txt文件中的所有内容
int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	fputs("blackpink", pf);
	
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

2)fgets:char* fgets(char* str, int num, FILE* stream)

将文件中从开始位置向后num个字符数读取到str中,它是文本行输入函数 => 所有输入流

eg:

#include <stdio.h>
int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

    //读文件
	char arr1[50] = "****************************************";
	fgets(arr1, 5, pf);
	printf("%s\n", arr1); //black
	
    //关闭文件
	fclose(pf);
	pf = NULL;
	
    return 0;
}

(3)fprintf与fscanf:

1)fprintf:int fprintf(FILE* stream, const char* format)

向stream文件流中格式化写入一定的数据,它是格式化输出函数 => 所有输出流

eg:

#include <stdio.h>
//假设已清空
int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

    //写文件
	fprintf("%s %d %l", "zhangsan", 20, 95.4f); 
	
    //关闭文件
	fclose(pf);
	pf = NULL;
	
    return 0;
}

2)fscanf:int fscanf(FILE* stream, const char* format)

从stream文件流中格式化读取一定的数据,它是格式化输入函数 => 所有输入流

eg:

#include <stdio.h>

struct Stu
{
    char name[20];
    int age;
    float grade;
}s;

int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

    //读文件
	fscanf(FILE* pf, "%s %d %f", s.name, s.age, s.grade);
	
    //关闭文件
	fclose(pf);
	pf = NULL;
	
    return 0;
}

(4)fwrite与fread:

由于返回值类型为size_t,则看是否读写成功,看返回值大小是否ptr所向的数组的大小

size_t size:每个元素的字节大小

size_ count:元素个数

1)fwrite:size_t fwrite(const void* ptr, size_t size, size_t num, FILE* stream)

它是二进制输出函数 => 文本输出流

eg:

#include <stdio.h>
//假设已清空
int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "bw");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

    //写文件
	char buf[] = "blackpink";
	fwrite(buf, sizeof(char), 9, pf);
	
    //关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

2)fread:size_t fread(void* ptr, size_t size, size_t num, FILE* stream)

它是二进制输入函数 => 文本输入流

eg:

#include <stdio.h>

int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "br");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

    //读文件
	char ret[] = "0";
	fread(ret, sizeof(char), 9, pf);
	
    //关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4.文件的随机访问函数

(1)feek:int feek(FILE* stream, int offset, int origin)

根据文件指针的位置与偏移量来定位文件指针。

关于origin:有三种情况:SEEK_CUR(文件指针当前位置),SEEK_END(文件末尾位置),SEEK_SET(文件开头位置)

eg:

#include <stdio.h>

int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

    //读文件
    //文件开头向后5个位置
    fseek(pf, 5, SEEK_SET);
    //从第六个元素开始替换后面四个元素为rose
	fputs("rose", pf);

    //关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

(2)ftell:long int ftell(FILE* stream)

返回文件指针相对于起始位置的偏移量

eg:

#include <stdio.h>

int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

    //读文件
    //文件开头向后5个位置
    fseek(pf, 5, SEEK_SET);
    //从第六个元素开始替换后面四个元素为rose
	fputs("rose", pf);
    int ret = ftell(pf);
    printf("%d", ret); // 9

    //关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

(3)rewind:void rewind(FILE* stream)

让当前文件指针回到文件的起始位置

5.文件结束的标志

feof:int feof(FILE* stream)

判断一个文件的读取是否是在文件末尾才结束,还是其他问题(往往中途不会出错,一般是开头就直接出错,用ferror进行判断)

eg:

#include <stdio.h>
//现在文件的内容:text.txt:blackrose
int main()
{
    //打开文件
	FILE* pf = fopen("text.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    
    //读文件
    int ch = 0;
    while((ch = fgetc(pf)) != EOF)
    {
        printf("%c", ch); // blackrose
    }
    
    //判断是否读取到文件末尾
    if((ch = fgetc(pf)) == EOF)
    {
        if(feof(pf))
        {
            printf("文件读取到末尾");
        }
        else if(ferror(pf))
        {
            printf("文件为读取到末尾,是有其他错误");
            perror("ferror");
        }
    }

    //关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值