文档章节

读写文件-C

yxmsw2007
 yxmsw2007
发布于 2017/08/11 22:52
字数 2229
阅读 5
收藏 0

open与fopen

int open(const char *path, int access,int mode)

path 要打开的文件路径和名称

access 访问模式,宏定义和含义如下:

  • O_RDONLY 1 只读打开

  • O_WRONLY 2 只写打开

  • O_RDWR 4 读写打开

还可选择以下模式与以上3种基本模式相与:

  • O_CREAT 0x0100 创建一个文件并打开

  • O_TRUNC 0x0200 打开一个已存在的文件并将文件长度设置为0,其他属性保持

  • O_EXCL 0x0400 未使用

  • O_APPEND 0x0800 追加打开文件

  • O_TEXT 0x4000 打开文本文件翻译CR-LF控制字符

  • O_BINARY 0x8000 打开二进制字符,不作CR-LF翻译

mode 该参数仅在access=O_CREAT方式下使用,其取值如下:

  • S_IFMT 0xF000 文件类型掩码

  • S_IFDIR 0x4000 目录

  • S_IFIFO 0x1000 FIFO 专用

  • S_IFCHR 0x2000 字符专用

  • S_IFBLK 0x3000 块专用

  • S_IFREG 0x8000 只为0x0000

  • S_IREAD 0x0100 可读

  • S_IWRITE 0x0080 可写

  • S_IEXEC 0x0040 可执行

FILE *fopen(char *filename, char *mode)

filename 文件名称

mode 打开模式:

  • r 只读方式打开一个文本文件

  • rb 只读方式打开一个二进制文件

  • w 只写方式打开一个文本文件

  • wb 只写方式打开一个二进制文件

  • a 追加方式打开一个文本文件

  • ab 追加方式打开一个二进制文件

  • r+ 可读可写方式打开一个文本文件

  • rb+ 可读可写方式打开一个二进制文件

  • w+ 可读可写方式创建一个文本文件

  • wb+ 可读可写方式生成一个二进制文件

  • a+ 可读可写追加方式打开一个文本文件

  • ab+ 可读可写方式追加一个二进制文件

open和fopen的区别:

前者属于低级IO,后者是高级IO。

前者返回一个文件描述符,后者返回一个文件指针。

前者无缓冲,后者有缓冲。

前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。

后者是在前者的基础上扩充而来的,在大多数情况下,用后者

fdopen和fileno

C语言文件指针与文件描述符之间可以相互转换


#include <stdio.h>

FILE *fdopen (int filedes, const char * opentype);

int fileno (file * stream);

rewind

函数名: rewind()

功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头

注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。 rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET);[1]

用 法: void rewind(FILE *stream);

头文件: stdio.h

返回值:无

fgetc和fputc

int fgetc(FILE *stream)

fgetc()函数从输入流的当前位置返回一个字符,并将文件指针指示器移到下一个字符处,如果已到文件尾,函数返回EOF,此时表示本次操作结束,若读写文件完成,则应关闭文件。

int fputc(int ch,FILE *stream)

fputc()函数完成将字符ch的值写入所指定的流文件的当前位置处,并将文件指针后移一位。fputc()函数的返回值是所写入字符的值,出错时返回EOF。


#include <stdio.h>

int main(int argc, char* argv[]) {

    char ch;

    FILE *fp, *fp2;

    int i;
    
    if ((fp = fopen(argv[1], "r")) == NULL) {

        printf("not open!");

        return 0;
    
    }

    if ((fp2 = fopen(argv[2], "w")) == NULL) {

        printf("not open fp2!");

        return 0;
    
    }

    while((ch = fgetc(fp)) != EOF) {

        putchar(ch); 

        fputc(ch, fp2);
    
    }

    fclose(fp);

    fclose(fp2);

    printf("Hello World!\n");

    return 0;

}

fscanf和fprintf

int fscanf(FILE *stream,char *format,arg_list)

int fprintf(FILE *stream,char *format,arg_list)

对文件的格式化读写就是在上述函数的前面加一个字母f成为fscanf( )和fprintf( )

其中,stream为流文件指针,其余两个参数与scanf( )和printf( )用法完全相同。


#include <stdio.h>

/*
 * 将一些格式化的数据写入文本文件,再从该文件中医格式化方法读出显示在屏幕上,
 * 其格式化数据是两个学生记录,包括姓名、学号、两科成绩。
 * */ 

 int main(int argc, char* argv[]) {

     struct stu { /* 定义结构体类型 */ 

        char name[15];

        char num[6];

        float score[2];

     } student; /* 说明结构体变量 */ 

     FILE *fp;

     if ((fp = fopen(argv[1], "w")) == NULL) {

        printf("not open %s!", argv[1]);

        return 0;

     }

     int i; /* 在循环条件中声明变量的话,只在C99标准中支持,C90标准不支持 */ 

     for (i = 0; i < 2; i++) {

        scanf("%s %s %f %f", student.name, student.num,
                &student.score[0], &student.score[1]); /* 从键盘键入 */ 

        fprintf(fp, "%s %s %7.2f %7.2f\n", student.name, 
                student.num, student.score[0], student.score[1]); /* 写入文件 */ 

     }

     while(fscanf(fp, "%s %s %f %f\n", student.name, student.num, 
                    &student.score[0], &student.score[1]) != EOF) {

        printf("%s %s %7.2f %7.2f\n", student.name, student.num, 
                    student.score[0], student.score[1]); /* 显示到屏幕 */ 

     }

     fclose(fp);

     return 0;

 }

fgets和fputs

char *fgets(char *str,int num,FILE *stream) // 感觉是在读一行数据

int fputs(char *str,FILE *stream)

fgets() 函数从流文件stream中读取至多num-1个字符,并把它们放入str指向的字符数组中。读取字符直到遇见回车符或EOF(文件结束符)为止,或读入了所限定的字符数。

fputs( )函数将str指向的字符串写入流文件。操作成功时,函数返回0值,失败返回非零值。


#include <stdio.h>

#include <string.h>

int main(int argc, char* argv[]) {

    char str[128];
    
    FILE *fp1, *fp2;
    
    if ((fp1 = fopen(argv[1], "r")) == NULL) {

        printf("not open %s!", argv[1]);

        return 0;
        
    }

    if ((fp2 = fopen(argv[2], "w")) == NULL) {

        printf("not open %s!", argv[2]);

        return 0;
    
    }

    while(fgets(str,128,fp1) != NULL) {

        fputs(str, fp2);    //从文件1读字符串并写入文件2

        printf("%d, %s", (int) strlen(str), str);
    
    }

    fclose(fp1);

    fclose(fp2);

    return 0;

}

fread和fwrite

int fread(void *buf,int size,int count,FILE *stream)

int fwrite(void *buf,int size,int count,FILE *stream)

fread()函数从stream 指向的流文件读取count (字段数)个字段,每个字段为size(字段长度)个字符长,并把它们放到b u f(缓冲区)指向的字符数组中。

fread()函数返回实际已读取的字段数。若函数调用时要求读取的字段数超过文件存放的字段数,则出错或已到文件尾,实际在操作时应注意检测。

fwrite( )函数从buf(缓冲区)指向的字符数组中,把count(字段数)个字段写到stream所指向的流中,每个字段为size个字符长,函数操作成功时返回所写字段数。


#include <stdio.h>

int main(int argc, char* argv[]) {

    struct stu { /* 定义结构体类型 */ 

        char name[15];

        char num[6];

        float score[2];

    } student; /* 说明结构体变量 */ 
    
    FILE *fp;
    
    if ((fp = fopen(argv[1], "wb+")) == NULL) { /* 以二进制读写方式打开文件 */ 

        printf("not open %s!", argv[1]);

        return 0;
    }

    int i; /* 在循环条件中声明变量的话,只在C99标准中支持,C90标准不支持 */ 

    for (i = 0; i < 2; i++) {

        scanf("%s %s %f %f", student.name, student.num,
                    &student.score[0], &student.score[1]); /* 从键盘键入 */ 

        fwrite(&student, sizeof(student), 1, fp);
    
    }

    for (i = 0; i < 2; i++) {

        fread(&student, sizeof(student), 1, fp);

        printf("%s %s %7.2f %7.2f\n", student.name, student.num, 
                    student.score[0], student.score[1]); /* 显示到屏幕 */ 
    
    }

    fclose(fp);

    return 0;

}

fseek和ftell

函数名: fseek()

功 能: 重定位流(数据流/文件)上的文件内部位置指针

注 意: 文件指针指向文件/流。位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。

用 法: int fseek(FILE *stream, long offset, int fromwhere);

头文件: stdio.h

返回值: 成功,返回0,失败返回-1,并设置errno的值,可以用perror()函数输出错误

函数名: ftell()

功 能: 用于得到文件位置指针当前位置相对于文件首的偏移字节数,使用fseek函数后再调用函数ftell()就能非常容易地确定文件的当前位置

用 法: long ftell(FILE *stream);

头文件: stdio.h

返回值: 获取stream指定的文件的当前读写位置

ftell(fp);利用函数 ftell() 也能方便地知道一个文件的长。如以下语句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp); 首先将文件的当前位置移到文件的末尾,然后调用函数ftell()获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。


#include <stdio.h>

int main(int argc, char* argv[]) {

    long len;

    FILE *fp;
    
    if ((fp = fopen(argv[1], "rb")) == NULL) {

        printf("not open!");

        return 0;
    
    }

    fseek(fp, 0, SEEK_END);

    len = ftell(fp);

    fclose(fp);

    printf("len = %ld\n", len);

    return 0;

}

atoi、stof和atol

关于成块的文件读写,在创建文件时只能以二进制文件格式创建。

通常,对于输入数据的格式较为复杂的话,我们可采取将各种格式的数据当做字符串输入,然后将字符串转换为所需的格式。C提供函数:

int atoi(char *ptr)

float atof(char *ptr)

long int atol(char *ptr)

它们分别将字符串转换为整型、实型和长整型。使用时请将其包含的头文件math.h或stdlib.h写在程序的前面。

源码下载

SampleC-CPP

参考资料

open和fopen区别

几个能用的C语言IO读写数据的例子

© 著作权归作者所有

上一篇: VIM常用命令
下一篇: Windows常用命令
yxmsw2007

yxmsw2007

粉丝 4
博文 42
码字总数 40160
作品 0
深圳
程序员
私信 提问
C语言编程新手初学者基础知识学习:文件的读写操作

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/05/23
0
0
fopen参数@windows和linux的区别

作为文件的数据,在计算机中都是以二进制的形式存储的。因此,对于文本文件和二进制文件的区分,不是在物理上的,而是在逻辑上的。 在开发时,遇到一个小问题,代码在linux下运行读写文件正常...

地狱的烈火
2013/07/29
539
0
android JNI之C 语言回顾:文件的读写和随机数函数

由于C语言更适于操作硬件,且在一些处理文件的操作上效率比较高,所以在类似操作一般使用JNI调用C代码进行操作: 比如音频,视频以及图像的处理: 具体如音频格式的转码器,类似于photo关于图片...

长平狐
2012/09/03
2.1K
0
C语言文件操作(四)

实例四:随机读写。在C:\TEST.TXT 文件中创建如下字符串:我爱你,中国 使用随机读写,输出"中国"两个字,以为中文字符占两个字节,所以要从文件首部向后偏移7个字节,逗号是英文字符,占用一个...

milanlover_xa
2014/05/14
0
0
Linux Bash/C 文件读写相关练习

子任务一 系统文件读写 (1)读取/etc/passwd内容 (2)将/etc/passwd系统文件内容复制到新建文件passwd中 (3)将/etc/passwd系统文件内容一半复制到新建文件passwd_half中 C源代码 python写法 py...

hakase
2016/10/10
21
0

没有更多内容

加载失败,请刷新页面

加载更多

秒杀系统思路

业务分析 技术挑战 请求响应要快:无论成功失败,需要尽快返回给用户 架构设计   前端:静态化   站点层:限制请求数   服务层:乐观锁写缓存   数据库CAP:读写高可用,一致性,扩容...

雷开你的门
6分钟前
4
0
最全的教育行业大数据解决方案,个个针对痛点

大数据的悄然兴起也带动了教育行业的革新,移动教育、云课堂等的出现,使得教育行业再次成为了可以中长期保持高景气的行业。然而,初涉数据领域的教育行业同时也面临着相当大的难题,还需要更...

朕想上头条
10分钟前
3
0
预约模块设计分析

1.预约功能描述: 预约是小程序中常见的一种商品管理系统,商家可根据商品或服务的特性,灵活设置预约细节,为用户提供线上预约服务,如场地预约,商品预定等,实现高效经营。 预约场景: ...

鱼煎
13分钟前
3
0
阿里云日志服务构建网站实时分析大盘实战

场景分析 挖掘数据价值是当前企业级网站共同面临的问题。买买网是一个电商平台网站,每天拥有大量的用户访问和购买记录。为了引导用户直接消费,提升购买率和转化率,不同的用户类别需要推荐...

阿里云官方博客
14分钟前
2
0
TL665xF-EasyEVM开发板硬件处理器、NAND FLASH、RAM

广州创龙结合TI KeyStone系列多核架构TMS320C665x及Xilinx Artix-7系列FPGA设计的TL665xF-EasyEVM开发板是一款DSP+FPGA高速大数据采集处理平台,其底板采用沉金无铅工艺的6层板设计,适用于高...

Tronlong创龙
18分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部