C语言基础---文件操作

版权声明:本文为小斑马伟原创文章,转载请注明出处!
一、文件api的分类

01)文件读写api
    fgetc fputc     按照字符读写文件
    fputs fgets     按照行读写文件 (读写配置文件)
    fread fwirte    按照块读写文件 (大数据块迁移)
    fprintf         按照格式化进行读写文件
                fprintf(fp, "%s = %s\n", pKey, pValue);

02)文件控制api  
    文件是否结束
    文件指针的定位、跳转
    fseek(fp, 0L, SEEK_END); //把文件指针从0位置开始,移动到文件末尾
    //获取文件长度;
    length = ftell(fp);

    fseek(fp, 0L, SEEK_SET);
03)api做项目

二、标准文件的读写
1.文件的打开fopen()
文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头。
fopen(char filename,char type);
其中
filename是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。而
type参数表示了对打开文件的操作方式。其可采用的操作方式如下:
方式 含义
"r" 打开,只读
"w" 打开,文件指针指到头,只写
"a" 打开,指向文件尾,在已存在文件中追加
"rb" 打开一个二进制文件,只读
"wb" 打开一个二进制文件,只写
"ab" 打开一个二进制文件,进行追加
"r+" 以读/写方式打开一个已存在的文件
"w+" 以读/写方式建立一个新的文本文件
"a+" 以读/写方式打开一个文件文件进行追加
"rb+" 以读/写方式打开一个二进制文件
"wb+" 以读/写方式建立一个新的二进制文件
"ab+" 以读/写方式打开一个二进制文件进行追加
当用fopen(0成功的打开一个文件时,该函数将返回一个FILE指针,如果文件打开失败,将返回一个NULL指针。如想打开test文件,进行写:

FILE *fp;
if((fp=fopen("test","w"))==NULL)
{
    printf("File cannot be    opened\n");
    exit();
} else {
    printf("File opened for writing\n");
      ……
    fclose(fp);
}

2.关闭文件函数fclose()
文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。
int fclose(FILE *stream);
它表示该函数将关闭FILE指针对应的文件,并返回一个整数值。若成功地关闭了文件,则返回一个0值,否则返回一个非0值。常用以下方法进行测试:

if(fclose(fp)!=0)
{
    printf("File cannot be closed\n");
    exit(1);
}   else {
 printf("File is now closed\n");
}

当打开多个文件进行操作,而又要同时关闭时,可采用fcloseall()函数,它将关闭所有在程序中打开的文件。
int fcloseall();
该函数将关闭所有已打开的文件,将各文件缓冲区未装满的内容写到相应的文件中去,接着释放这些缓冲区,并返回关闭文件的数目。如关闭了4个文件,则当执行:n=fcloseall(); 时,n应为4。
3.按照字符读文件
include<stdio.h>
int fgetc(FILE* stream);
功能:从stream指定的文件中读取一个字符
参数:stream:文件指针
返回值:成功:返回读取到字符 失败:-1

FILE* fp = fopen("D://a.txt", "r");
if (fp == NULL) {
    printf("打开文件失败\n");
    return -1;
}
printf("文件打开成功:%p\n", fp);
char ch;
while ((ch = fgetc(fp)) != EOF) {
    printf("%c", ch);
}
fclose(fp);

文件结尾:在C语言中,EOF表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的行驶存放。
3.按照字符写文件
int fputc(int ch,FILE* stream);
功能:讲ch转换为unsigned char 后写入stream指定的文件中
参数:ch:需要写入文件的字符 stream:文件指针
返回值:成功:成功写入文件的字符 失败:返回-1
feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用判断文本文件。
int feof(FILE *stream)
功能:检测是否读取到了文件结尾。判断的是最后一次”读操作的内容"不是当前位置内容(上一个内容)
参数:stream:文件指针
返回值:非0值:已经到文件结尾 0:没有到文件结尾

FILE* fp = fopen("D:/a.txt", "w");

if (!fp) {
    printf("文件打开失败\n");
    return -1;
}

char ch;
while(1){
    scanf("%c", &ch);
    if (cj == '@') {
        break;
    }
    fputc(ch, fp);
}

fclose(fp);

4.文件加密和解密

 int main(void) {
FILE* fp1 = fopen("D://解密.txt", "r");
FILE* fp2 = fopen("D://加密.txt", "w");
if (!fp1 || !fp2) {
    return -1;
}

char ch;
while ((ch = fgetc(ch, fp1)) != EOF) {
    ch++;
    //加密
    fputc(ch, fp2);
}
fclose(fp2);
fclose(fp1);

system("pause");
return 0;
}

int main(void) {
FILE* fp1 = fopen("D://解密.txt", "r");
FILE* fp2 = fopen("D://加密.txt", "w");
if (!fp1 || !fp2) {
    return -1;
}

char ch;
while ((ch = fgetc(ch, fp1)) != EOF) {
    ch--;
    //解密
    fputc(ch, fp2);
}
fclose(fp2);
fclose(fp1);

system("pause");
return 0;
}

5.文件行读操作
功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出换行字符、读到文件结尾或是已读了size-1个字符为止,最后会自动加上'\0'作为字符串结束。
参数:str:字符串 size:指定最大读取字符串的长度(size-1) stream:文件指针
返回值:成功:成功读取的字符串 读到文件尾或出错:NULL
fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也作为字符串的一部分。通过scanf和gets输入一个字符串的时候,不包含结尾的"\n",但通过fgets结尾多了"\n"。fgets()函数是安全的,不存在缓冲区溢出的问题。

FILE* fp = fopen("D://a.txt", "r");

if (!fp)
    return -1;
char* p = (char*)malloc(sizeof(char)* 100);

//feof(文件指针) 判断文件是否到结尾 可以判断文本文件也可以判断二进制文件
//如果到文件结尾返回值为  非0的值
//如果没有到文件结尾返回值为 0
while (!feof(fp)) {
    memset(p, 0, 100);
    fgets(p, 100, fp);

    printf("%s\n", p);
}

free(p);
fclose(fp);

5.文件行写操作
功能:将str所指定的字符串写入到stream指定的文件中,字符结束符'\0'不写入文件。
参数:str 字符串 stream 文件指针,如果把字符串输出到屏幕,固定写为stdout
返回值:成功 0 失败 -1
fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'

FILE* fp = fopen("D:/d.txt", "w");
if (!fp)
    return -1;

char ch[] = "你哈哈哈";
fputs(ch, fp);

fclose(fp);
system("pause");

键盘输入 写入文件中

FILE* fp = fopen("D://B.txt", "w");
if (!fp)
    return -1;
char* p = (char*)malloc(sizeof(char)* 1024);

while (1) {
    memset(p, 0, 1024);
    //fgets()
    scanf("%[^\n]", p);
    //吞噬回车\n
    getchar();
    //停止输入命令 comm = exit
    if (!strcmp(p, "comm=exit"))
        break;
    //追加\n
    strcat(p, "\n");
    fputs(p, fp);
}
free(p);
fclose(fp);

6.四则运算文件行写操作

enum opt {
   add,sub,mlt,dive
}op;

int main() {

srand((size_t)time(NULL));
FILE* fp = fopen("D://四则运算.txt", "w");
if (!fp) {
    return -1;
}

int a, b;
char c;//+ - * /
char* p = (char*)malloc(sizeof(char)* 20);
for (int i = 0; i < 100; i++) {
    a = rand() % 10 + 1;
    b = rand() % 10 + 1;

    switch (rand()%4)
    {
    case add: c = '+';
        break;
    case sub: c = '-';
        break;
    case mlt: c = '*';
        break;
    case dive: c = '/';
        break;
    default:
        break;
    }
    memset(p, 0, 20);
    printf(p, "%d%c%d=\n", a, c, b);
    fputs(p, fp);
}

free(p);
fclose(fp);

system("pause");
return 1;

}

6.四则运算文件行读操作

FILE* fp1 = fopen("D:/四则运算.txt", "r");
FILE* fp2 = fopen("D:/四则运算结果.txt", "w");
if (!fp1 || !fp2) {
    printf("打开文件失败\n");
    return -1;
}
int a,b,sum;
char c;
char* p = (char*)malloc(sizeof(char)*20);
for (int i = 0; i < 100; i++) {
    memset(p, 0, 20);
    fgets(p,20,fp1);

    sscanf(p, "%d%c%d=\n", &a, &c, &b);
    switch (c) {
    case '+':sum = a + b; break;
    case '-':sum = a - b; break;
    case '*':sum = a * b; break;
    case '/':sum = a / b; break;
    }
    memset(p, 0, 20);
    sprintf(p, "%d%c%d = %d\n", a, c, b, sum);
    fputs(p, fp2);
}

free(p);
fclose(fp1);
fclose(fp2);

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

推荐阅读更多精彩内容

  • [转]C/C++ 文件读写操作总结 在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以...
    天之道天知道阅读 5,199评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,731评论 0 6
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,744评论 0 10
  • 当你老了,白发苍苍,睡意蒙眬, 在炉前打盹,请取下这本诗篇, 慢慢吟诵,梦见你当年的双眼, 那柔美的光芒与青幽的晕...
    本藩阅读 466评论 0 0