您的位置:首页 > 编程语言 > C语言/C++

文件操作,及文件操作时的权限设置,快速实现文件拷贝,C语言常用IO函数

2017-11-02 22:08 513 查看
定义一个文件类型指针。用于保存打开文件后的指针。

C语言中可以用 gets(char *str) 来输入一行(包括空格)。

FILE *p = fopen("文件名",“打开的权限”);

其中权限可以是w ,此时如果文件不存在会自动创建,如果存在就会自动覆盖(内容);

权限也可以 r ,可以对文件中的内容进行读取。为r时文件必须存在,不存在打开则会失败,返回NULL。

r+ ,对文件可读写,但是只要有r,文件就必须存在。

rb+ , 不加b按文本文件的方式来读文件,

加b按二进制的方式来读文件,windows系统中,文本模式下,文件以 "\r\n"结尾 ,如果用fputs将“\n”写入文件时,会自动在前面加个\r变成 “\r\n” ,而linux等unix系统下,是否加b不影响,即没有区别。

w+ ,打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。

a+

权限 a ,以追加方式添加文本。如果文件不存在那么就创建这个文件,如果文件存在就在文件结尾处开始追加。

feof( FILE *p),判断是否到了文件尾。

fputs(*str, FILE);   将字符串写入文件中。

fgets(char * str , sizeof(str), p) ; 读取 str大小的内容到字符串中。

从文件指针中读取一个字符 

ch = getc(p) ;

读出文件中所有内容

while( (ch = getc(p)) != EOF)
{
printf("%c",ch);
}
将一个字符写入文件

putc(ch ,p) ;

打开文件后要用 fclose(p) ,关闭文件指针。

feof(p) ;  判断是否已经到了文件结尾。如果到了,则返回真。

要读取文件中所有内容

while( !feof(p))
{
memset(s,0,sizeof(s));
fgets(s,sizeof(s),p);
}


<
4000
p>文件内容复制:

FILE * p1 = fopen("D:\\a.txt","r");
FILE * p2 = fopen("D:\\cp.txt","w");
char buf[1024] ;
while(!feof(p1))
{
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),p1);
fputs(buf,p2);
}
fclose(p1);
fclose(p2);


普通文件加密:

在每次从文件从读出一行到buf后,调用加密函数。

code(char * str)
{
while(*str)
{
(*s)++ ;
s++;
}
}二进制文件加密:
code函数中要加入一个length,因为可能传入的参数可能不是一个字符串

C语言常用IO函数:

scanf    printf

sscanf   sprintf

fscanf    fprintf   // fscanf 与scanf用法基本一致,fscanf是从一个文件读取输入。

fscanf(FILE * p, "%s",buf) ; 可以以解析文件中固定格式的字符。

fscanf(FILE * p ,"%d + %d",&a,&b); 即能将文件中 a1 + b1 中a1和b1的值存入a,b。

fprintf(FILE *p ,"%s",buf) ; 将buf中的字符全部输出到文件中。(即写入到文件)

getc     putc   //只能对文本文件进行操作。

图片,视频以及word文件都是二进制文件。

要操作二进制文件。可以使用 fread 和 fwrite,如果使用它们,而打开的时候不加b ,则导致读出的文件大小缺失。(windows下必须要写,linux下则可写可不写);

fread(buf, sizeof(char), ARTsize , p)  

fread(buf, sizeof(char), sizeof(buf)-1,p) //按照字节数进行读写。如果第三个参数不减1,打印buf的时候将出现乱码,原因时\r\n为换行符。 如果buf的大小大于文件中有的大小,则拷贝二进制文件时会出错(因为新的文件的大小为buf大小大于原二进制文件的大小)

解决办法:

size_t  res = fread(buf, sizeof(char), sizeof(buf), p1);   //返回读出的字节数。

fwrite(buf, sizeof(char), res , p2 ) ;  
//  返回多少字节就写进去多少字节

stat函数。 在 <sys/stat.h>头文件中。结构体类型 stat 里可以保存文件的各种信息。

使用方式:

struct stat st ={0} ; 定义一个结构
stat("D:\\a.txt",&st); //调用完stat函数后,文件的属性就保存在了 st结构体中。
例如现在就可以打印出a.txt文件的大小。
printf("%d",st.st_size) ;
这样当一个要拷贝的文件特别大时,为了提高拷贝速率,可以在堆内存中生气一个内存空间来拷贝。

char * array = malloc(st.st_size) ;
FILE * p = fopen("D:\\b.txt","rb");
fread(array, sizeof(char), st.st_size, p); 相当于将文件内容一次性读到堆空间中
fclose(p) ;
然后再调用fwrite将 array写入另一个文件即完成拷贝。还可以将结构体写入文件,或者将文件中的内容写入结构体。

对一系列字符串(里面存的数字)进行排序并输出:

int array[512] = {0};
while(!feof(p))
{
char buf[100] = {0};
fgets(buf,sizeof(buf),p); 读取文件中的一行到字符数组中
if(buf[0] != 0) //如果不加此处,文件如果有空行的话在下面atoi转换时将会转化成0这个值并记录。
{
int value = atoi(buf) ; //默认字符串里全是 0-512之间的字符。
array[value]++ ; 记录值为value所出现的次数。
}
}
for(int i =0 ; i<512; i++)
{
for(int j=0; j<array[i]; j++)
printf("%d",i);
}可以通fseek调整文件指针的位置。
fseek(FILE *p, sizeof(struct student), SEEK_END);  //第二个参数为偏移量。

SEEK_SET  实际上定义了宏  0

SEEK_CUR      1

SEEK_END       2

ftell用于得到文件位置指针相对于文件首的偏移字节数。

long  len = ftell( FILE * p) ;

程序通过C语言函数库往文件里面写数据时,并不是实时将数据直接写入磁盘,而是放到内存里面,当内存满了或者明确的调用了fclose,才将数据一次性写入磁盘。 C语言的文件操作函数都是缓冲区函数。

而通过每次写完后,调用fflush(FILE * p) ;数据就会实时进入文件。

好处:停电,电脑死机等故障导致缓冲区的内容丢失。

不好:硬盘读写次数增加,导致程序效率低下,同时硬盘寿命变短。

//修改配置文件的时候,有时候会使用,或者做一些不经常修改的数据,但很重要数据,那么就需要用fflush.

删除文件 remove("D\\a.txt")  ;即删除文件。

文件改名rename("D:\\a.txt","D:\\m.txt") ; 将D盘中的文件a.txt改名为m.txt;

getchar  putchar

fgets   fputs

fgetc    fputc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐