C语言——文件操作

本文详细介绍了C语言中文件的打开、关闭、读写操作,包括文本文件和二进制文件的处理。通过示例代码展示了如何使用fopen、fclose、fgetc、fputc、fgets、fputs、fread、fwrite、fscanf、fprintf等函数进行文件的读写及定位。同时,提到了文件定位函数如fseek和rewind,以及文件状态检测函数feof和ferror。
摘要由CSDN通过智能技术生成

文件操作

C语言中文件主要分为两种:文本文件,二进制文件(通常是指除文本文件以外的文件)。

打开和关关闭文件
打开文件

打开文件用到的函数为fopen();
返回值

  1. 如果文件打开成功,则返回一个指向FILE结构的文件指针;
  2. 如果文件打开失败,则返回一个NULL并设置errno为指定错误;
备注:
  1. path参数:该参数是一个C语言字符串,指定了带打开文件的文件路径和文件名
  2. path参数可以使相对路径(…/file.txt)也可以是绝对路径(/home/open/file.txt),如果只给出文件名而不包含路径,则表示该文件在当前文件夹中 。

mode参数

模式描述
“r”1.以只读的模式打开一个文本文件,文件从头开始读取; 2.该文本必须存在
“w”1以只写的模式打开一个文本文件,从头开始写入; 2.如果文件不存在则创建一个新文件;3.如果文件存在,则重新开始写入内容(覆盖原内容)
“a”1.已追加的模式打开一个文本文件,从文件末尾追加新的内容;2.如果文件不存在则创建一个新的文件
“r+”1.以读和写的模式打开一个文本文件,从文件开始读取和写入;2.该文件必须存在;3.该模式不会覆盖原内容。
“w+”1.以读和写的模式打开一个文本文件,从文件开始读取和写入;2.如果文件不存在则创建一个新的文件;3.如果文件存在则会覆盖原有内容
“a+”1.以读和追加的模式打开一个文本文件;2.如果文件不存在则创建一个新的文件;3.读取是从文件头开始的追加是从文件末尾追加的
“b”1.结合上面6种模式,以二进制文件的模式打开;例:“rb” “ab”
关闭文件:

关闭文件用到的函数是:fclose();
注:

  • 文件打开后一定要关闭

例:

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
	FILE *fp;
	int ch;
	
	if ((fp = fopen ("file.txt","w"))==NULL)
	{
		printf ("\ncannot open the file\n");
		exit(1);
	}
	else 
	{
		printf ("\nopen file successfully\n");
	}
	fclose(fp);
	printf ("\ncomplete the operation!\n");
	
	return 0;	
}
文件操作

了解了文件的打开和关闭之后,那么就需要了解怎么修改文件的内容了。
文件读写

字符变量 = fgetc(文件指针);
fputc(字符,文件指针);
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	FILE *fp1; 
	FILE *fp2;
	char ch;
	
	if ((fp1 = fopen("file1.txt", "r"))==NULL)
	{
		printf ("\ncannot open the  file\n");
		exit(1);
	}
	if ((fp2 = fopen("file2.txt", "w"))==NULL)
	{
		printf ("\ncannot open the  file\n");
		exit(1);
	}

	while ((ch = fgetc(fp1))!=EOF)
	{
		fputc(CH, fp2);
	}

	fclose(fp1);
	fclose(fp2);
	printf ("\ncomplete the operation!\n");
	
	return 0;
	}
fgets(字符数组名,n,文件指针);
fputs(字符串, 文件指针);

注:

  • 从文件读取的字符串不超过n-1个字符,之后自动加入’\0’
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	FILE *fp1;
	FILE *fp2;
	char str[10];
	
	if ((fp1 = fopen("file1.txt", "r"))==NULL)
	{
		printf ("\ncnanot open the file\n");
		exit(1);
	}
	if ((fp2 = fopen("file2.txt", "w"))==NULL)
	{
		printf ("\ncnanot open the file\n");
		exit(1);
	}

	fgets(str, 10, fp1);
	fputs(str, file2);	
	
	fclose(fp1);
	fclose(fp2);
	printf ("\ncomplete the operation!\n");
	
	return 0;	
}
fread(ptr, size, count, fp);
fwrite(ptr, size, count, fp);
参数含义
ptr指向存放数据的内存块,该内存块的尺寸最小应该是size * count个字符
size指向要读取的每个元素的尺寸,最终尺寸等于size * count
count指定要读取的元素个数,最终尺寸等于size * count
fp该参数是一个FILE对象的指针,指定一个待读取文件流
#include <stdioh.>
#include <stdlib.h>
#include <string.h>

struct Date
{
	int year;
	int month;
	int day;
};

struct Book;
{
	char name[40];
	char author[40];
	char publisher[40];
	struct Date date;
};

int main (void)
{
	FILE *fp;
	struct Book *book_for_write, *book_for_read;
	
	book_for_write = (struct Book *)malloc(sizeof (struct Book));
	book_for_read = (struct Book *)malloc(sizeof (struct Book));
	
	if (book_for_write == NULL||book_for_read == NULL)
	{
		printf ("\n内存分配失败\n!");
		exit(1);	
	}

	strcpy (book_for_write -> name, "算法!");
	strcpy (book_for_write -> author, "马克");
	strcpy (book_for_write -> publisher, "机械工业出版社");
	book_for_write -> date.year = 1997;
	book_for_write -> date.mouth = 11;
	book_for_write -> date.day = 11;
	
	if ((fp = fopen("file.txt", "r"))==NULL)
	{
		printf ("\ncannot open the file\n");
		exit(1);
	}

	fwrite (book_for_write, sizeof (struct Book), 1, fp);

	fclose (fp);

	if ((fp = fopen("file.txt", "r"))==NULL)
	{
		printf ("\ncannot open the file\n");
		exit(1);
	}
	
	fread (book_for_read, sizeof(struct Book), 1, fp);
	
	printf ("书名:%s\n", book_for_read -> name);
	printf ("作者:%s\n", book_for_read -> author);
	printf ("出版社:%s\n", book_for_read ->publisher);
	
	fclose (fp);
	
	
	return 0;	
}
fscanf(文件指针,格式字符串, 输入列表);
printf(文件指针, 格式字符串, 输出列表);

注:

  • 这两个函数在输入和输出的时候要将文件内容转换为二进制形式,在转换为文本文件。
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	FILE *fp1;
	FILE *fp2;
	int var;
	char ch;

	if ((fp1 = fopen("file1.txt", "r"))==NULL)
	{
		printf ("\ncannot open the file\n");
		exit(1);
	}
	if ((fp2 = fopen("file2.txt", "w"))==NULL)
	{
		printf ("\ncannot open the file\n");
		exit(1);
	}

	fscanf(fp1, "%d%c", &var,&ch);
	fprintf(fp2, "%d%c", var, ch);
	
	fclose(fp1);
	fclose(fp2);
	
	return 0;	
}

文件定位函数

fseek(文件指针,位移量,起始点);

注:

rewind(文件指针);

注:
将指针移到文件首位;没有返回值

ftell(文件指针);
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	IFLE *fp;

	if ((fp = fopen("file.txt", "w")) = NULL)
	{
		printf ("\ncannot open file\n");
		exit(1);	
	}

	printf ("%ld\n", ftell(fp));
	fputs("Hello", fp);
	pritnf ("%ld\n", ftell(fp));
	fputs("world!", fp);
	pritnf ("%ld\n", ftell(fp));

	rewind(fp);
	fputs("file", fp);

	fclose (fp);
	
	return 0;
	}

文件检测函数

feof
ferror
cleareer
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值