精华内容
下载资源
问答
  • FILE *fp = fopen(path, "w"); long pos; fscanf(fp, "%ld", &pos);
                FILE *fp = fopen(path, "w");
    			long pos;
    			fscanf(fp, "%ld", &pos);
    
    展开全文
  • 在项目里面经常会用到读取一些配置信息,而C语言有没有直接的读取配置文件的函数,这里贴出我写的代码,有兴趣的看一下,也希望能有好的建议。考虑到代码需要在多个项目里面运行,会对配置文件有不同的需求,这里把...

    在项目里面经常会用到读取一些配置信息,而C语言有没有直接的读取配置文件的函数,这里贴出我写的代码,有兴趣的看一下,也希望能有好的建议。

    考虑到代码需要在多个项目里面运行,会对配置文件有不同的需求,这里把文件路径封装在一个struct里面,方便在里面添加一些其他的变量,头文件声明如下:

    hcof.c

    /******************************************************************

    * 用途: 配置文件读写 *

    * 作者: uehang *

    * 日期: 2013-3-28 *

    *****************************************************************/

    #ifndef HCONF_H

    #define HCONF_H

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    typedef struct h_conf{

    char file_path[200];

    }HConf;

    void init_conf(HConf *hconf, char *file_path);

    /*

    * return: -1:fail to open file; 0: can not find the key; 1: success

    */

    int get_conf_value(HConf *hconf, char *key_name, char *value);

    /*

    * return: -1:fail to open file; 0: can not find the key; 1: success

    */

    int set_conf_value(HConf *hconf, char *key_name, char *value);

    #endif

    首先,初始化函数,对当前的情况来说,只负责把参数file_path的值传递到参数hcnf的file_path变量,这里单独写成一个函数,不仅是让get_conf_value()和set_conf_value()在调用时避免写一长串的file_path,也是方便在有特殊需求的情况下,对文件名进行检验或对文件进行预处理。

    get_conf_value()与set_conf_value()负责读写文件,由于配置文件多是在程序启动或者特殊时刻才会读取,所以没有必要一直打开文件。

    hconf.c

    #include "hconf.h"

    void init_conf(HConf *hconf, char *file_path)

    {

    int fd=open(file_path,O_RDONLY);

    if(fd>2){ //确保文件存在

    close(fd);

    strcpy(hconf->file_path,file_path);

    }else{

    perror("can not open config file:");

    }

    }

    int get_conf_value(HConf *hconf, char *key_name, char *value)

    {

    int res;

    int fd = open(hconf->file_path,O_RDONLY);

    if(fd > 2){

    res = 0;

    char c;

    char *ptrk=key_name;

    char *ptrv=value;

    while((read(fd,&c,1))==1){

    if(c == (*ptrk)){

    do{

    ptrk ++;

    read(fd,&c,1);

    }while(c == (*ptrk));

    if(c=='='&&(*ptrk)=='\0'){

    while(1)

    {

    read(fd,&c,1);

    if(c != '\n')

    {

    (*ptrv) = c;

    ptrv ++;

    }else{

    (*ptrv) = '\0';

    break;

    }

    }

    res = 1;

    break;

    }else{

    do{

    read(fd,&c,1);

    }while(c != '\n');

    }

    }else{

    do{

    read(fd,&c,1);

    }while(c != '\n');

    }

    }

    close(fd);

    }else{

    res = -1;

    }

    return res;

    }

    int set_conf_value(HConf *hconf, char* key_name, char *value)

    {

    int res;

    int fd = open(hconf->file_path,O_RDONLY);

    if(fd > 2){

    char buf[800]; //存储文件内容

    res = 0;

    char c;

    char *ptrk=key_name;

    char *ptrv=value;

    char *ptrb=buf;

    while((read(fd,&c,1))==1){

    *ptrb = c;

    if(c == *ptrk){

    do{

    ptrb ++;

    ptrk ++;

    read(fd,&c,1);

    *ptrb = c;

    }while(c == *ptrk);

    if(c == '=' && *ptrk == '\0'){//找到目标行

    do{

    ptrb ++;

    *ptrb = *ptrv;

    ptrv ++;

    }while(*ptrv != '\0'); //将value赋值给buf

    while((read(fd,&c,1)) == 1 && c != '\n');//等号右边原来的内容舍弃

    ptrb ++;

    *ptrb = '\n';

    }else { //非目标行全部读取

    while((read(fd,&c,1)) == 1){

    ptrb ++;

    *ptrb = c;

    if(c == '\n'){

    break;

    }

    }

    }

    }else{ //非目标行全部读取

    while((read(fd,&c,1)) == 1){

    ptrb ++;

    *ptrb = c;

    if(c == '\n'){

    break;

    }

    }

    }

    ptrb ++;

    }

    *ptrb = '\0'; //循环结束,buf末尾置'\0'

    close(fd);

    fd=open(hconf->file_path,O_WRONLY|O_TRUNC);//截短打开文件,写入buf

    if(fd > 2){

    write(fd,buf,strlen(buf));

    close(fd);

    res = 1;

    }

    }else{

    res = -1;

    }

    return res;

    }

    所有打开的文件都有一个当前文件偏移量(current file offset),可以简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。这里通过每次的read()和write()函数来改变偏移量,使定位准确。

    由于c语言中的文件是以数据流的形式来进行读写的,无法直接进行插入、删除的操作,这里把文件内容经处理后全部读取到内存里面,然后从内存写入到原文件里面,实现对文件的修改。

    测试

    这里用一个简单的文件测试一下

    main.c

    #include

    #include

    #include "hconf.h"

    int main()

    {

    HConf *info = (HConf *) malloc(sizeof(HConf));

    init_conf(info,"./info.conf");

    char buf[20];

    get_conf_value(info,"email",buf);

    printf("email = %s --get from info\n",buf);

    set_conf_value(info,"age","115 years old");

    printf("set info:age = 115 years old\n");

    return 0;

    }

    结果:

    0818b9ca8b590ca3270a3433284dd417.png

    原info.conf                                                                                               运行后info.conf

    0818b9ca8b590ca3270a3433284dd417.png                                                     

    0818b9ca8b590ca3270a3433284dd417.png

    总结

    总的来说,是实现了基本读写功能,而且只用了文件操作的open()、read()、write()这三个函数,而在测试时也发现,对中文的比较和判断会出错,若有大侠路过,也恳求指点。

    展开全文
  • C语言文件目录查看

    2013-10-04 16:08:00
    C语言文件目录遍历通常会用到下面这些函数  _access() /* 判断文件或文件夹路径是否合法 */  _chdir() /* 切换当前工作目录 */  _findfirst() /* 查找第一个符合要求的文件或目录 */  _findnext() /* ...

    C语言下文件目录遍历通常会用到下面这些函数

      _access()        /* 判断文件或文件夹路径是否合法 */

      _chdir()     /* 切换当前工作目录 */

      _findfirst()    /* 查找第一个符合要求的文件或目录 */

      _findnext()     /* 查找下一个 */

      _findclose()    /* 关闭查找 */

    与此同时还会使用到 struct _finddata_t 结构体

       struct _finddata_t  { 
                 unsigned attrib;                       /* 表示文件的属性 */

                 time_t time_create;                 /* 表示文件创建的时间 */  

                 time_t time_access;                 /* 表示文件最后访问的时间 */

                 time_t time_write;                   /* 表示文件最后写入的时间 */ 

                _fsize_t size;                            /* 表示文件的大小 */
                 char name[FILENAME_MAX];       /* 表示文件的名称 */

            };

    文件属性(attrib)的值可以取下面的值:

             #define _A_NORMAL 0x00000000
             #define _A_RDONLY 0x00000001
             #define _A_HIDDEN 0x00000002
             #define _A_SYSTEM 0x00000004
             #define _A_VOLID 0x00000008
             #define _A_SUBDIR 0x00000010
             #define _A_ARCH  0x00000020

    在io.h文件中FILENAME_MAX 被定义为260

    下面给出的是一个简单的小程序用于列出目录C:\ 下的文件夹的名字

    (这里建议大家使用斜杠'/',少用'\',windows下程序能够自动解析'/',使用反斜杠时需要使用"\\")

     1 #include <dir.h>
     2 #include <stdio.h>
     3 #include <io.h>
     4 #include <string.h>
     5 
     6 int main(int argc, char* argv[])
     7 {
     8     char path[100] = "C:/";
     9     
    10     struct _finddata_t fa;
    11     long handle;
    12     
    13     if((handle = _findfirst(strcat(path,"*"),&fa)) == -1L)
    14     {
    15         printf("The Path %s is wrong!\n",path);
    16         return 0;
    17     }
    18     
    19     do
    20     {
    21         if( fa.attrib == _A_SUBDIR && ~strcmp(fa.name,".")&& ~strcmp(fa.name,".."))
    22             printf("The subdirectory is %s\n",fa.name);
    23     }while(_findnext(handle,&fa) == 0); /* 成功找到时返回0*/ 
    24     
    25     _findclose(handle);
    26     
    27     return 0;    
    28 } 
    View Code

     

     

     

    转载于:https://www.cnblogs.com/surgewong/p/3351577.html

    展开全文
  • C语言获取文件大小

    万次阅读 多人点赞 2014-05-27 15:09:07
    C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在C语言中就比较麻烦,... 目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下: int file_size(char

    C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在C语言中就比较麻烦,例如获取一个文件的大小。Java中File类有个length函数,Python中os.path包中有个getsize函数,C语言中却没有直接对应的函数获取文件大小。

           目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下:

    int file_size(char* filename)
    {
        FILE *fp=fopen(filename,"r");
        if(!fp) return -1;
        fseek(fp,0L,SEEK_END);
        int size=ftell(fp);
        fclose(fp);
        
        return size;
    }
    

    上述方法利用fseek移动一个文件的存取位置到文件的末尾,然后利用ftell获得目前的文件访问位置。这种方法可以认为是一种间接的获取方式。虽说可以获得文件大小,但是有两个缺点。首先,ftell的返回值为long,在不同环境下占用的字节数也不同,这就可能存在long是四个字节的情况。此时,获取的文件大小就不能超过2G,否则就会出错。

    但是,上述缺点在大多数情况下都没问题,超大文件还可以通过fsetpos和fgetpos获取文件大小。最致命的缺陷就是它需要加载文件到内存,然后跳转到文件末尾,这个操作非常耗时!可能在读取少量文件时体现不出,但是当文件达到上万个时,速度就会慢的要命,这种方法相当于把所有的文件都读到内存中一遍!

    如果可能,尽量避免采用上述间接的方式获取文件大小。在linux下,还有一种更简单的方式,通过读取文件信息获得文件大小,速度也快很多。代码如下:

    #include <sys/stat.h>
    int file_size2(char* filename)
    {
        struct stat statbuf;
        stat(filename,&statbuf);
        int size=statbuf.st_size;
    
        return size;
    }
    

    这种方式首先获得相关文件的状态信息,然后从状态信息中读取大小信息。由于没有读取文件的操作,所以操作速度非常快。强烈建议大家在linux下使用这种方式。Windows平台下肯定也有类似的函数读取文件信息,不过本人常年不在windows下编程,所以在此不做介绍。

    展开全文
  •  目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下: int file_size(char* filename) { FILE *fp=fopen(filename,r); if(!fp) return -1; fseek(fp,0L...
  • 查看c语言文件打开方式的时候发现分两种方式,标准文件的打开方式和非标准文件的打开方式。 标准文件打开用fopen 非标准文件用open 占坑,标准文件是哪些 ...
  • Linux C语言编程查看文件权限

    千次阅读 2019-01-29 18:34:43
    下面代码查看文件是否有读权限 #include &lt;unistd.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;sys/stat.h&gt; int main(int argc, char* argv[]...
  • c语言获取文件大小

    2017-02-16 15:53:27
    C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在C语言中就比较... 目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下: [cpp] view plain copy pri
  • 使用C语言查看一个文件夹中所有文件及目录

    万次阅读 多人点赞 2018-04-27 16:22:07
    为了使用C语言实现查看一个文件夹中的文件数量功能,可以使用dirent库,该库文件包含的许多UNIX系统服务的函数原型,例如opendir函数、readdir函数,可以实现查看目录中文件数量等功能。 2.1dirent中常用数据类型...
  • 这里关于存放路径说一下,如果没有指定则放在当前路径,上图我放在D盘中,可查看是否创建 2.既然创建打开关闭都会了,接下来我们说说读和写先来单个字符的读(fgetc)和写(fputc)(把test12.txt的内容
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#include#define N 1000int split(char *filename,char words[][20]){FILE *fp;int i=0,j=0,k;char ch;if((fp=fopen(filename,"r"))==NULL){printf("源文件读取...
  • C语言实现文件系统模拟器

    千次阅读 2019-06-08 13:08:45
    cd 查看当前路径 cd dir 当前目录变为str所表示路径的目录 cd … 当前目录变为当前目录的父目录 mkdir str 在当前目录下创建一个名为str的子目录 mkfile str 在当前目录下创建一个名为str的文件 delete str ...
  • C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在c语言中就比较...目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下: 1 int file_size(char* fil...
  • C语言文件写入学生信息并读取显示出来 代码功能: 1.从控制台输入学生信息(姓名、年龄、学号和平均分),可以输入任意数目的信息数据。 2.将输入的学生信息数据写入文件中进行保存,文件每行存储一条学生信息,...
  • C语言文件写入

    2019-09-25 14:08:57
    1.文件指针的方式 头文件 #include<conio.h> #include<stdlib.h> #inlcude<...查看文件创建是否成功 if((fp = fopen("test.dat","w")) == NULL) { printf("\nerror on open test.d...
  • C语言中最常用的库文件,在调用其中方法的时候,可以查看函数源码,了解C的函数是怎么实现的
  • C语言实现的一个使用单链表的学生管理系统,使用文件存储学生信息,结构体中包括学号、姓名和成绩,实现的功能有系统初始化(创建链表,读取文件中的信息到链表),添加学生记录,根据学号删除学生记录,根据学号...
  • C语言c语言文件

    2018-04-07 12:13:03
    这周复习了c语言文件部分,就将知识总结如下,方便以后查看。 首先是文件知识:文件有ASCII文件和二进制文件,数据在内存中以二进制形式存储,不加转换输出到外存,就是二进制文件。如果在外存上以ASCII形式存储...
  • 想了解C语言文件定义等相关知识请查看我的另一篇博客:C语言文件详解 定义一个指向文件(FILE类型数据)的指针 FILE *fp; 指向文件的指针变量并不是指向外部介质上的数据文件的开头,而是指向内存中的文件信息区...
  • printf("\t\t\t[2]查看现有菜品信息\t\n"); printf("\t\t\t[3]将现有菜品价格从小到大排序\t\n"); printf("\t\t\t[4]查找现有菜品信息\t\n"); printf("\t\t\t[5]删除现有菜品信息\t\n"); printf("\t\t\t[6]...
  • 0827 include include int main(void) {  int n;  unsigned long count = 0;  unsigned char buf[16];  FILE *fp;...16进制文本查看 8位数字表达一个十六进制指针地址

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,615
精华内容 646
关键字:

c语言查看文件

c语言 订阅