C语言文件操作

文件操作:

C语言中操作文件,第一步是打开文件,第二步是操作文件,最后一步是关闭文件。

1.fopen(“目录”,“mode”):目录可以是绝对目录,也是当前的工作目录。返回值是FILE*结构。

R :只读,文件必须存在;不可以写入

R+:读写,但是文件必须存在,并且从文件开头写入

A: 追加方式打开,如果文件不存在,就创建一个新文件,否则就在文件末尾追加内容

W: 只写,如果文件存在,将文件内容清零,如果不存在就创建这份文件。如果是以二进制文件读取的,要想换行就得加\r\n。

W+:可读写,存在的话改写文件

RW+:读写

2.fclose(p):关闭文件

3.getc(p): 从打开的文件中一次读取一个字符,并且文件指针自动后移一位,返回值是字符类型。对于一个文件,最后的字符是EOF。回车键也可以读出来,适合读取文本文件,不适合读取二进制文件。

4.putc(c,p):往文件中一次只能写入一个字符c。

5.二进制和文本文件的区别:在windows下,文本模式下,在写入文件的时候,\n会被自动转换为\r\n,实际写入文件的是\r\n,读取的时候\r\n会转换为\n.但是linux下是没有的。二进制模式下的时候,windows下使用\n不能正常换行。

6.EOF和feof(p):EOF适合getc(),feof(p)函数如果到了文件的最后,返回TRUE,使用putc()时会将文件的结尾EOF == -1输出来,这个时候可以加一个判断语句if(c == EOF)退出。

7.fgets(buf,sizeof(buf),p):读取文本文件的一行,不会读到EOF;会将换行读到buf中,是相对安全的,不存在内存溢出

8.fputs(buf,p):写入文件一行

9.fscanf(p,”%d”,buf);从文件中读取一行字符串,格式化到buf中,忽略行尾的换行字符,超过buf大小的时候,有内存溢出的危险。

10.fprintf(p,”%d”,buf):将buf格式化到文件中的一行,指定输出到文件中。

11.fseek(p,offset,SEEK_SET)//从文件开头向后移动offset个字节。

   fseek(p,-1,SEEK_END)    //从文件末尾向前移动一个字节。

   fseek(p,1,SEEK_CUR)     //从当前位置向后移动一个字节。

程序

1.文件拷贝: 就是使用getc()将一个文件读出一个字符后,使用putc()写入到另一个文件中。

2.文件加密:就是将一个文件读出一个字符后加一(C++),然后写入另一个文件当中。

3.文件解密:在加密文件的基础上,将一个文件读出一个字符后减一(C--),然后写入另一个文件

4.加载配置文件:将密钥写到a.ini这个文件中,然后使用fopen打开这个文件,得到里面的密钥,转换为int类型,并且返回到程序中。

5.将a.txt文件中,格式(i = 1)为这样的i后的值相加,然后写入b.txt

思路:得到文件的一行,然后得到“=”后面的字符串,将“=”后面的字符串转换为整数,然后sum += i,直到文件结束;将sum转换为字符串.

      还有另外一个思路就是使用sscanf(buf,”i = %d”,&i)将得到文件的一行中的数字格式化到i中。

代码:写一个函数getsubstr()得到“=”后面的子串,循环读取直到找到到“=”的时候返回return &s[i+1];

      将整数转换为字符串的时候,可以使用sprintf(buf,“%d”,sum)将sum格式化到buf中。

6.将a.txt文件中,格式(i = 1)为这样的i后的值排序,并且格式和a.txt的一样,然后写入b.txt

思路:用一个buf数组来保存从文件中读取的字符,每读取一行就放到一个raw字符数组中,然后将raw追加到buf后面,对buf进行冒泡排序,但是只对字符排序,遇到’\n’跳过。

代码:首先写一个字符串追加的函数,然后写冒泡排序,而且是改良版的,在遇到’\n’的时候,用下一个字符和上一个字符s[j+1]和s[j-1]比较,并且j++;直到下下个字符,因为已经比较了。

 

7.字符串追加:因为s2不需要改变,使用const

char* mystrcat(char *s1, const char* s2)

{

    int len1 = strlen(s1);

    int len2 = strlen(s2);

    int i;

    for (i = 0; i < len2; i++)

    {

        s1[len1 + i] = s2[i];

    }

    return s1;

}



文件操作

#include<stdio.h>

#include<math.h>

#include<string.h>

#include<stdlib.h>

#pragma warning(disable:4996)

#include<time.h>

 

struct num

{

    unsigned i;

};

 

int main()//写入a.dat文件随机数

{

    srand((unsigned int)time(NULL));

    struct num n;

    FILE *p = fopen("a.dat","wb");

    if (p == NULL)

    {

        return 0;

    }

 

    int i;

    for (i = 0; i < 10000000;i++)

    {

        n.i =rand() / 128;

        fwrite(&n,sizeof(n), 1, p);

        //printf("%d\n",rand()/128);

 

    }

    fclose(p);

    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值