• C语言文件读写操作总结


    参考:http://blog.csdn.net/strongwangjiawei/article/details/7786085/

    一.非标准文件的读写 不带缓冲的

    1.文件的打开和关闭

    open()函数的作用是打开文件,其调用格式为: int open(char *filename, int access); 该函数表示按access的要求打开名为filename的文件,返回值为文件描述字,其中access有两部分内容: 基本模式和修饰符, 两者用" "("或")方式连接。修饰符可以有多个, 但基本模式只能有一个。

    access的规定 基本模式 含义 修饰符 含义

    O_RDONLY 只读

    O_APPEND 文件指针指向末尾

    O_WRONLY 只写

    O_CREAT 文件不存在时创建文件, 属性按基本模式属性

    O_RDWR 读写

    O_BINARY 打开一个二进制文件

    O_TEXT 打开一个文字文件

    open()函数打开成功, 返回值就是文件描述字的值(非负值), 否则返回-1。 close()函数的作用是关闭由open()函数打开的文件, 其调用格式为: int close(int handle); 该函数关闭文件描述字handle相连的文件。

    2.读写函数

    int read(int handle, void *buf, int count);

    read()函数从handle(文件描述字)相连的文件中, 读取count个字节放到buf所指的缓冲区中, 返回值为实际所读字节数, 返回-1表示出错。返回0 表示文件结束。 write()函数的调用格式为: int write(int handle, void *buf, int count); write()函数把count个字节从buf指向的缓冲区写入与handle相连的文件中, 返回值为实际写入的字节数。

    3.随机定位函数

    lseek()函数的调用格式为: int lseek(int handle, long offset, int fromwhere);

    该函数对与handle相连的文件位置指针进行定位,功能和用法与fseek()函数相同。 tell()函数的调用格式为: long tell(int handle); 该函数返回与handle相连的文件现生位置指针, 功能和用法与ftell()相同

    二、标准文件的读写

    1.文件的打开函数fopen()

    文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头。

    fopen(char *filename,char *type); 

    其中*filename是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。而*type参数表示了对打开文件的操作方式。其可采用的操作方式如下: 方式 含义 "r" 打开,只读; "w" 打开,文件指针指到头,只写; "a" 打开,指向文件尾,在已存在文件中追加; "rb" 打开一个二进制文件,只读; "wb" 打开一个二进制文件,只写; "ab" 打开一个二进制文件,进行追加 ;"r+" 以读/写方式打开一个已存在的文件; "w+" 以读/写方式建立一个新的文本文件 ;"a+" 以读/写方式打开一个文件文件进行追加 ;"rb+" 以读/写方式打开一个二进制文件; "wb+" 以读/写方式建立一个新的二进制文件 ;"ab+" 以读/写方式打开一个二进制文件进行追加 ;当用fopen()成功的打开一个文件时,该函数将返回一个FILE指针,如果文件打开失败,将返回一个NULL指针。

    2.关闭文件函数fclose() 

    文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。

    int fclose(FILE *stream); 

    它表示该函数将关闭FILE指针对应的文件,并返回一个整数值。若成功地关闭了文件,则返回一个0值,否则返回一个非0值。

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    int main()
    {
        FILE *fp;   //  头文件#include <stdio.h>
        if((fp=fopen("123.txt","w"))==NULL)
        {
            printf("file cannot open 
    ");
            //exit(0);  头文件#include <stdlib.h>
            //exit结束程序,一般0为正常推出,其它数字为异常,其对应的错误可以自己指定。
        }
        else
            printf("file opened for writing 
    ");
        if(fclose(fp)!=0)
            printf("file cannot be closed 
    ");
        else
            printf("file is now closed 
    ");
        return 0;
    }

    3.文件的读写

    (1).读写文件中字符的函数(一次只读写文件中的一个字符):

    int fgetc(FILE *stream);

    int getchar(void);

    int fputc(int ch,FILE *stream);

    int putchar(int ch);

    int getc(FILE *stream);

    int putc(int ch,FILE *stream);

    fgetc()函数将把由流指针指向的文件中的一个字符读出,例如: ch=fgetc(fp); 将把流指针fp指向的文件中的一个字符读出,并赋给ch,当执行fgetc()函数时,若当时文件指针指到文件尾,即遇到文件结束标志EOF(其对应值为-1),该函数返回一个-1给ch,在程序中常用检查该函数返回值是否为-1来判断是否已读到文件尾,从而决定是否继续。

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    int main()
    {
        FILE *fp;
        char ch;
        if((fp=fopen("123.txt","r"))==NULL)
            printf("file cannot open 
    ");
        else
            printf("file opened for writing 
    ");
        while((ch=fgetc(fp))!=EOF)
            fputc(ch,stdout); //这里是输出到屏幕
        if(fclose(fp)!=0)
            printf("file cannot be closed 
    ");
        else
            printf("file is now closed 
    ");
        return 0;
    }

    该程序以只读方式打开123.txt文件,在执行while循环时,文件指针每循环一次后移一个字符位置。用fgetc()函数将文件指针指定的字符读到ch变量中,然后用fputc()函数在屏幕上显示,当读到文件结束标志EOF时,关闭该文件。 上面的程序用到了fputc()函数,该函数将字符变量ch的值写到流指针指定的文件中去,由于流指针用的是标准输出(显示器)的FILE指针stdout,故读出的字符将在显示器上显示。又比如: fputc(ch,fp); 该函数执行结构,将把ch表示的字符送到流指针fp指向的文件中去。 在TC中,putc()等价于fputc(),getc()等价于fgetc()。 putchar(c)相当于fputc(c,stdout);getchar()相当于fgetc(stdin)。 注意,这里使用char ch,其实是不科学的,因为最后判断结束标志时,是看ch!=EOF,而EOF的值为-1,这显然和char是不能比较的。所以,某些使用,我们都定义成int ch。

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    int main()
    {
        FILE *fp;
        if((fp=fopen("123.txt","a"))==NULL)
            printf("file cannot open 
    ");
        else
            printf("file opened for writing 
    ");
        char ch='e';
        fputc(ch,fp); //输入到文件中
        if(fclose(fp)!=0)
            printf("file cannot be closed 
    ");
        else
            printf("file is now closed 
    ");
        return 0;
    }

    (2).读写文件中字符串的函数

    char *fgets(char *string,int n,FILE *stream);

    char *gets(char *s);

    int fprintf(FILE *stream,char *format,variable-list);

    int fputs(char *string,FILE *stream);

    char *puts(char *s);

    int fscanf(FILE *stream,char *format,variable-list);

    其中fgets()函数将把由流指针指定的文件中n-1个字符,读到由指针string指向的字符数组中去,例如: fgets(buffer,9,fp); 将把fp指向的文件中的8个字符读到buffer内存区,buffer可以是定义的字符数组,也可以是动态分配的内存区。 注意,fgets()函数读到'/n'就停止,而不管是否达到数目要求。同时在读取字符串的最后加上'/0'。 fgets()函数执行完以后,返回一个指向该串的指针。如果读到文件尾或出错,则均返回一个空指针NULL,所以长用feof()函数来测定是否到了文件尾或者是ferror()函数来测试是否出错,

    检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);

    例:if(feof(fp))printf("已到文件尾");

    原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);

    例:printf("%d",ferror(fp));

    例如下面的程序用fgets()函数读test.txt文件中的第一行并显示出来:

    #include "stdio.h" 
    int main() {
        FILE *fp; 
        char str[128]; 
        if((fp=fopen("123.txt","r"))==NULL) {
            printf("cannot open file/n"); exit(1);
        } 
        while(!feof(fp)) {
            if(fgets(str,128,fp)!=NULL)
            printf("%s",str);
        }
        fclose(fp);
    } 

    gets()函数执行时,只要未遇到换行符或文件结束标志,将一直读下去。因此读到什么时候为止,需要用户进行控制,否则可能造成存储区的溢出。 fputs()函数想指定文件写入一个由string指向的字符串,'/0'不写入文件。 fprintf()和fscanf()同printf()和scanf()函数类似,不同之处就是printf()函数是想显示器输出,fprintf()则是向流指针指向的文件输出;fscanf()是从文件输入。 下面程序是向文件test.dat里输入一些字符:

    #include <stdio.h>
    #include <stdlib.h>
    int main() {
        char *s="That's good news"; 
        int i=617; 
        FILE *fp;
        fp=fopen("test.dat", "w"); /*建立一个文字文件只写*/ 
        fputs("Your score of TOEFL is",fp); /*向所建文件写入一串字符*/ 
        fputc(':', fp); /*向所建文件写冒号:*/ 
        fprintf(fp, "%d/n", i); /*向所建文件写一整型数*/ 
        fprintf(fp, "%s", s); /*向所建文件写一字符串*/ 
        fclose(fp);
    } 

    用DOS的TYPE命令显示TEST.DAT的内容如下所示: 屏幕显示 Your score of TOEFL is: 617 That's good news 下面的程序是把上面的文件test.dat里的内容在屏幕上显示出来:

    #include <stdio.h>
    int main() {
        char s[24], m[20]; 
        int i;
        FILE *fp;
        fp=fopen("test.dat", "r"); /*打开文字文件只读*/
        fgets(s, 24, fp); /*从文件中读取23个字符*/
        printf("%s", s); 
        fscanf(fp, "%d", &i); /*读取整型数*/
        printf("%d", i); 
        putchar(fgetc(fp)); /*读取一个字符同时输出*/
        fgets(m, 17, fp); /*读取16个字符*/ 
        puts(m); /*输出所读字符串*/ 
        fclose(fp); 
    } 
  • 相关阅读:
    Linux服务器管理: 系统的定时任务crond
    Nmon的安装使用及获取报表
    笔记:LoadRunner性能测试巧匠训练营
    python-解决安装MySQL-python出现的: Python version 2.7 required,which was not found in the registry
    JMeter监控内存及CPU——plugin插件监控被测系统资源方法
    Linux监控
    SSL与TLS的区别以及介绍
    [存]Jmeter 如何实现跨线程组传递参数
    Robot Framework简介
    [转]Appium搭建六:安装Android模拟器
  • 原文地址:https://www.cnblogs.com/home123/p/8318903.html
Copyright © 2020-2023  润新知