• C/C++中的文件操作(1)


    前几天一直用Python做google code jam的练习题,文件操作很方便。如果用C/C++去做的话,那么首先要解决的就是文件操作。于是整理了一下文件操作的函数用法。先来看看C的文件操作。

    FILE* stream
    相关的头文件stdio.h,就可以使用与文件操作相关的数据类型和函数。
    文件的打开与关闭
    首先,定义文件指针,FILE* f,用fopen(const char* filename,const char* mode)来打开文件,用fclose(File* p)来关闭文件。
    文件的打开方式,"r"表示读,"w"表示写,"a"表示在文件末尾追加,然后加上"+"就表示既可以读又可以写。
    文件还可以按text或binary的模式打开,可以在mode里面加上"t"或"b"。默认情况下是按text模式打开。
    需要注意的是,对于"r"模式,文件必须存在,否则返回值NULL;而对于"w"和"a",如果文件不存在,则会创建新的文件。

    文件内容的读取与输出内容到文件
    int feof(File* p) 判断是否到文件尾,否的情况下才能继续往下读。
    int fgetc(FILE* p) 读取一个字符,返回值是int,对应的ascii值。
    char* fgets(char* str,int num, FILE* p) 读取指定数目为num的字符到str中。这个函数有返回值,如果读取成功,返回值与str地址一样,不成功则为NULL,所以读取之后还是先判断一下返回值是否为NULL。
    size_t fread(void* ptr,size_t size,size_t count,FILE* p) 竟然有四个参数,ptr指向的空间用来存放读到的内容,size表示读取的单元的byte数,count表示要读取的单元数,返回值表示实际读到的单元数。

    获得文件的长度
    // obtain file size:
    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);
    rewind (pFile);

    int fscanf(FILE* p,const char* format,...) format,与printf相同的一个参数,
    [=%[*][width][modifiers]type]
    * 表示
    width 读取一次的长度
    modifiers可以是
    h,表示short int或short unsigned int;
    l表示long int或long unsigned int或double,
    L表示long double。
    type表示值的类型,可以用的类型有
    %c 读取单个字符, char c;fscanf(p,"%c",&c);
    %d 读取整数,可以处理前面的+-,int d;fscanf(p,"%d",&d);
    %e或%E 读取浮点数,可以处理科学记数法,float f;fscanf(p,"%e",&f);
    %f 读取浮点数 float f;fscanf(p,"%f",&f);
    %g或%G 读取浮点数 float f;fscanf(p,"%g",&f);
    %s 读取字符串 char str[80];fscanf(p,"%s",str); 限定width,避免溢出
    %u 读取无符号数 unsigned int u;fscanf(p,"%u",&u);
    %o 读取8进制数 int o;fscanf(p,"%o",&o);
    %x或%X 读取16进制数 int x;fscanf(p,"%x",&x);

    输出内容到文件
    int fputc(int c,FILE* p) 写一个字符到文件,第一个参数是int类型;
    int fputs(const char* str,FILE* p) 将字符串str写到文件,与fgtes不同的是,不需要指定长度;
    size_t fwrite(const void* ptr,size_t size,size_t count,FILE* p) 与fread对应,返回值为成功写入的元素数,应该与count相等,否则就是出错了。
    int fprintf(FILE*p,const char* format,...)与printf对应的,将内容打印到文件。这里的format与fscanf的format有些不同,
    %[flags][width][.precision][length]specifier
    flags,
    - 要求输出左对齐,默认是右对齐
    + 对正数也输出符号+
    空格 在没有符号的时候输出空白,对于正数,不输出+则输出空格,在有+的flag时空格会忽略掉。
    # 在16或8进制输出时在前面加上0x
    0 空白处填充0
    width,
    number 用一个数字表示输出的元素所占位宽
    precision,
    .number 用一个数字表示需要输出几位小数
    length,
    h,l,L与fscanf类似,l在用于wchar_t字符或字符串输出时
    specifier,
    与fscanf相比,多了一个p,输出地址,%,两个%一起才表示输出一个%。

    输入输出重定向
    可以把标准输入输出重定向到文件,
    比如一般从stdin读取输入,用的读取函数是gets,read,scanf等,当想从文件读取输入的时候,不是将这些函数变成fgets,fread,fscanf,而是使用输入输出重定向。
    freopen(const char* filename,const char* mode, FILE* stream), 将stream重定向到filename对应的文件。失败则返回NULL。
    重定向标准输入到文件,之后就是从文件读取输入了。
    freopen("input.txt","r",stdin);
    重定向标准输出到文件,之后就把内容输出到文件了。
    freopen("output.txt","r",stdout);

    error
    void perror(const char* str),报错,输出给定的错误提示信息,并将全局的errno转换成对应错误信息输出。
    int ferror(FILE* p), 检查文件是否处于异常状态。

    接下来会继续整理C++的文件操作。

    整理过程只是自己的学习过程。虽然简单,但也需要积累。

  • 相关阅读:
    oracle nvl,to_char 函数(二)
    GridView的使用技巧
    asp.net应用程序性能的提高方案
    浅谈 ViewState
    最为关心的问题,hbase查询一条数据的过程.
    HBase的弊端。
    拙建:(mapreduce 如何来分步统计词频)
    终于找到hbase分布式存储数据的方式.
    迷局一般的openjdk6jdk!
    IT事业不好走,大家在虚拟的世界,记得回到真实的世界,不然你将会成为下一个张孝祥.
  • 原文地址:https://www.cnblogs.com/Frandy/p/c_file_op.html
Copyright © 2020-2023  润新知