C :文件

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

C文件基本知识#

什么是文件#

文件名#

文件的分类#

文件缓冲区#

文件类型指针#

1
2
3
4
5
6
7
8
9
10
11
12
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#

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

fclose#

顺序读写数据文件#

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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("不能打开文件!\n");
        exit(0);
    }
    ch = getchar(); // 每次接收一个字符
    while (ch != '#')   // 当输入#时结束循环
    {
        fputc(ch, fp);  // 向磁盘文件中输出一个字符
        putchar(ch);  // 将输出的字符显示在屏幕上
        ch = getchar();  //继续接收输入的字符
    }
 
    fclose(fp);
    putchar(10);   // 想屏幕输出换行符
 
    return 0;
 }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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("不能打开文件!\n");
        exit(0);
    }
    if ((out = fopen(outfile, "w")) == NULL)
    {
        printf("不能打开文件!\n");
        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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#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("请输入字符串:\n");
    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("不能打开文件!\n");
        exit(0);
    }
    printf("新的序列为:\n");
 
    for (i = 0; i < n; i++)
    {
        fputs(str[i], fp);  // 向文件中写入一个字符串,然后输出一个换行符
        fputs("\n", fp);
        printf("%s\n", str[i]);
    }
}

格式化方式读写文件#

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

 

随机读写数据文件#

文件位置标记及其定位#

1、文件位置标记

2、文件位置标记的定位

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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#

作者:Hang Shao

出处:https://www.cnblogs.com/pam-sh/p/13971788.html

版权:本作品采用「知识共享」许可协议进行许可。

声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.

posted @   PamShao  阅读(375)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu