zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Jupyter Notebook 编辑器美化
    Python3 与 C# 基础语法对比(List、Tuple、Dict、Set专栏)
    Ubuntu 18.04 安装微信(附企业微信)
    区块链概念
    Python3 与 C# 基础语法对比(String专栏)
    用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)
    ArchLinux 设置时间同步和硬件时间同步错误 No usable clock interface found
    ArchLinux dwm的安装和配置
    POJ-1182 食物链 并查集(互相关联的并查集写法)
    POJ-2236 Wireless Network 并查集
  • 原文地址:https://www.cnblogs.com/pam-sh/p/13971788.html
Copyright © 2011-2022 走看看