C :文件

  一直没有系统学习过该章节,现参考《C语言程序设计 (第四版)谭浩强》

C文件基本知识

什么是文件

文件名

文件的分类

文件缓冲区

文件类型指针

typedef struct
{
	short level;   // 缓冲区“满”或“空”的程度
	unsigned flags;   // 文件状态标志
	char fd;    // 文件描述符
	unsigned char hold;  // 如缓冲区无内存不读取字符
	short bsize; // 缓冲区的大小
	unsigned char* buffer;  // 数据缓冲区的位置
	unsigned char* curp;  // 指针当前的指向
	unsigned istemp; // 临时文件指示器
	short token;  // 用于有效性检查
};FILE

文件打开与关闭

fopen

if ((fp = fopen("lena.bmp", "r")) == NULL)
{
	printf("不能打开文件!
");
	exit(0);  // 关闭所有文件,终止正在执行的程序,待用户检查出错误后,修改后重新运行z
}

fclose

顺序读写数据文件

如何向文件中读写一个字符

#include <stdio.h>
#include <windows.h>
int main()
{
	FILE* fp = NULL;

	char ch, filename[10];
	printf("请输入文件名:");
	scanf("%s", filename);
	if ((fp = fopen("filename", "w")) == NULL)
	{
		printf("不能打开文件!
");
		exit(0);
	}
	ch = getchar(); // 每次接收一个字符
	while (ch != '#')   // 当输入#时结束循环
	{
		fputc(ch, fp);  // 向磁盘文件中输出一个字符
		putchar(ch);  // 将输出的字符显示在屏幕上
		ch = getchar();  //继续接收输入的字符
	}

	fclose(fp);
	putchar(10);   // 想屏幕输出换行符

	return 0;
 }

#include <stdio.h>
#include <windows.h>

void main()
{
	FILE *in,*out;

	char ch,infile[10],outfile[10];
	printf("请输入读入的文件名:");  
	scanf("%s", infile);
	printf("请输入输出的文件名:");
	scanf("%s", outfile);

	if ((in = fopen(infile, "r")) == NULL)
	{
		printf("不能打开文件!
");
		exit(0);
	}
	if ((out = fopen(outfile, "w")) == NULL)
	{
		printf("不能打开文件!
");
		exit(0);
	}
	while (!feof(in))   // feof(in)检查in所指向的文件是否结束,feof:检查到文件读写位置标记是否移动到文件的末尾
	{
		ch = fgetc(in);  // 从输入文件中读入一个字符,暂时存放在ch
		fputc(ch, out);  //将ch输出到文件中
		putchar(ch);   //将字符显示在屏幕上
	}
	putchar(10);   // 想屏幕输出换行符
	fclose(in);
	fclose(out);
}

补充:

1、以上程序是按文本文件方式处理的,也可以用此程序来复制一个二进制文件,只需将fopen函数中的参数换为:“rb”和“wb”

2、C系统将fputc和fgetc函数定义为宏名putcgetc

如何向文件中读写一个字符串

 

#include <stdio.h>
#include <windows.h>
#include <string.h>


void main()
{
	FILE* fp;
	char str[3][10], temp[10];  // str存放字符串的二维数组,temp是临时数组
	int i, j, k, n = 3;
	printf("请输入字符串:
");
	for (i = 0; i < n; i++)
	{
		gets(str[i]); // 输入字符串
 	}

	for (i = 0; i < n - 1; i++)  // 选择法对字符串进行排序
	{
		k = i;
		for (j = i + 1; j < n; j++)
		{
			if (strcmp(str[k], str[j]) > 0)  // strcmp:按字母大小比较两个字符串,相同返回0,否则返回1
				k = j;
		}
		if (k != i)
		{
			strcpy(temp, str[i]);   // strcpy:复制字符串
			strcpy(str[i], str[k]);
			strcpy(str[k], temp);
		}
	}
	if ((fp = fopen("s.txt", "w")) == NULL)
	{
		printf("不能打开文件!
");
		exit(0);
	}
	printf("新的序列为:
");

	for (i = 0; i < n; i++)
	{
		fputs(str[i], fp);  // 向文件中写入一个字符串,然后输出一个换行符
		fputs("
", fp); 
		printf("%s
", str[i]);
	}
}

格式化方式读写文件

二进制方式向文件读写一组数据

 

随机读写数据文件

文件位置标记及其定位

1、文件位置标记

2、文件位置标记的定位

 

#include <stdio.h>
#include <windows.h>
#include <string.h>

void main()
{
	FILE* fp1, * fp2;
	fp1 = fopen("pam.txt", "r");   //打开输入文件
	fp2 = fopen("s.txt", "w");   // 打开输出文件
	while (!feof(fp1))
	{
		putchar(getc(fp1));   // 逐个读入字符输出到屏幕上
	}
	putchar(10);
	rewind(fp1);  // 使文件位置标记返回文件头
	while (!feof(fp1))
	{
		putc(getc(fp1), fp2);  // 从文件头重新逐个读字符,输出到另外一个文件中
	}
	fclose(fp1);
	fclose(fp2);
}

  vfgrt67

随机读写的出错检测

ferror

 

clearerr

原文地址:https://www.cnblogs.com/pam-sh/p/13971788.html