C语言文件操作的那些细节

C语言文件常用操作

一、FILE结构体

    FILE *fp = fopen("YKDog.txt", "r");

FILE 是一个结构体。文件是存放在物理磁盘上的,包括文件控制块(FCB)数据块。文件控制块通常包括文件权限、日期(创建、读取、修改)、拥有者、文件大小、数据块信息。数据块用来存储实际的内容。对于打开的文件,操作系统是这样管理的:

系统维护了两张表,一张是系统级打开文件表,一张是进程级打开文件表(每个进程有一个)

FILE结构体

我们不能直接操作系统级的文件表, 所以我们可以通过进程级文件表指针间接操作FCB。FILE结构体中的_file指针指向了进程级文件表, 而进程级文件表保存了指向系统级文件表的指针和其他信息。简而言之,操作FILE结构体,就间接的操作了文件。而操作FILE结构体, 我们采用了FILE *fp这个指针。

二、fopen函数

    FILE *fp = fopen(文件路径,操作权限)

权限设置如下:

权限字符 含义
r 如果路径文件不存在就会返回NULL,不存在不会创建文件。
r+ 不存在报错并且不会创建
w 如果文件不存在不会返回NULL,并且会创建文件
a 如果文件不存在不会报错, 并且会自动创建文件
a+ 如果文件不存在不会报错自动创建, 在末尾追加不会覆盖
w+ 不存在不会返回NULL报错, 自动创建,会清空后覆盖

二、fputc和fgetc函数

fputc返回值是写入成功的字符,如果写入失败返回EOF(-1的一个宏, end of file缩写)

fputc(字符, FILE*)

fgetc(FILE*)返回一个读到的字符, 结尾或出错(比如权限不够)返回EOF
看一个练习就知道怎么用了

练习:写入a-z的字符到YKDog.txt中,再用fgetc读取

code

       
   FILE *fp = fopen("YKDog.txt", "w");
   //路径 + 写权限
   if (fp == NULL) printf("error");
   
   for(char i = 'a'; i <= 'z'; i++){
       printf("%-3c", fputc(i, fp));
       //返回值是写入成功的字符
   }
   printf("\n");

   fclose(fp);
   
   FILE *fpr = fopen("YKDog.txt", "r");
   if (fp ==  NULL) printf("error");
   char ch;
   while((ch = fgetc(fp)) != EOF){
       printf("%-3c", ch);
   }   
   

   fclose(fpr);

结果:

a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z 

a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

要特别注意的是写完一定要fclose不然不会把缓存中的数据写到磁盘上, 导致下边的读取出问题。

返回值总结:fputc 返回值是写入成功的字符,失败返回EOF。fgetc返回值是读取到的字符,失败或结束返回EOF

三、feof判断文件流结束标识函数

函数避免使用

feof如果到结束标识就返回1, 否则返回1.

练习使用fgetc获得之前YKDog中的a-z

易错思路:
如果没有遇到结束标识就一直打印。刚好结束就不执行while中语句了。然而忽略了这个延迟, 标志位要到下一次读取(fgetc)的时候才会修改为1.下一次读取, 已经超出范围。

    FILE *fp = fopen("YKDog.txt", "r");
    if (fp == NULL) printf("error");
    
    while(!feof(fp)){

        printf("%c ", fgetc(fp));

    }

    fclose(fp);

a b c d e f g h i j k l m n o p q r s t u v w x y z ?

修改思路,既然延迟一个读写修改结束单位。那我就多读取一次

    FILE *fp = fopen("YKDog.txt", "r");
    if (fp == NULL) printf("error");

    char ch = fgetc(fp);
    while(!feof(fp)){

        printf("%c ",ch );

        ch = fgetc(fp);

    }

    fclose(fp);

四、fputs和fgets

fputs 是写一个字符串到文件中。
fpusts(字符串首地址, FILE *) 返回值是 如果写入成功返回0 或字符串的长度(平台不一样结果不一, 肯定是非负), 失败返回EOF.\n等字符也会写入。并且自动加上\0

       FILE *fp = fopen("YKPig.txt", "w");
   if(fp == NULL) printf("error");
   
   int ret=fputs("Hello, YKPig\n", fp);

   printf("ret = %d\n", ret);

有的操作系统比如centOS, MacOS会在文本编辑结束后会自动在其后加入\n也就是0a。windows不会

fgets(buf, 10, FILE *fpr)
简单的说吧, 把fpr文件内容每次10-1个字节读入到buf中。如果遇到\n或者文件结束 结束读取。每读取一次在内容后自动添加\0。

返回值是每次成功读到的 保存到buf中字符的首个地址。失败返回NULL

总结:
fgets 函数返回有三个条件:

  • 读 n-1 个字符前遇到\n,读取结束。
  • 读 n-1 个字符前遇到 EOF,读取结束。
  • 最多读 n-1 个符。
  • 在每读一行后自动加’\0’。

Mac下读内容

Mac系统存储的数据

.表示\n换行。最后一个是系统加的

    FILE *fpr = fopen("YKBird.txt", "r");
    if (fpr == NULL) printf("error");
    
    char buf[1024];

    while(fgets(buf, 10, fpr) !=NULL  ){

        printf("%s=", buf);
    }

结果

123456789=abcdefg
=123456789=0
=abcdefg
=

注意:

  • 打印的时候是遇到\n才打印的。
  • buff中不是存储所有的结果。是存储每次读到的结果。
小码哥iOS
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,691评论 0 6
  • 概述 在C语言文件输入和输出操作的学习心得(一)介绍了一些关于C语言文件写入的知识,本文将对前文进行延伸。前文的实...
    nothingCheung阅读 1,467评论 3 4
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 9,991评论 3 53
  • 昨天,看到点评官诸慧的文章《码字的苦恼》也有同感,坚持写简书两个多月了,我的写作水平提高了多少呢?形成写作习惯了吗...
    盖小伍呀阅读 186评论 0 2
  • 最近,总是想些关于爱情的事情,也许现在单身想有个对象吧。 心里又告诉自己,何必要急着去恋爱呢?每天到处看看女孩儿...
    忆上阡陌阅读 178评论 0 1