盛夏的果实 发表于 2021-7-21 15:38:49

C语言文件操作

C语言文件操作
下列代码创建一个a.txt文件,权限777,fp为返回码
#include<stdio.h>
#include<fcntl.h>
int main(){
    int fp;
    fp=open("a.txt",O_CREAT,777);
    printf("%d\n",fp);
    close(fp);
return 0;
}fd是指文件描述符
open(filename,flag,power)
flag的值可以为O_CREAT(只有这个需要使用第三个参数,第三个参数可以为英文缩写也可以是八进制数字,在第三个参数后面添加一个逗号后,可以跟下面的参数一起使用S_IRUSR
Permits the file’s owner to read it.
S_IWUSR
Permits the file’s owner to write to it.
S_IRGRP
Permits the file’s group to read it.
S_IWGRP
Permits the file’s group to write to it.)|O_RDONLY|O_WRONLY|O_RDWR|O_APPEND(需要跟前面的可写一起用)|O_EXCL(测试是否存在,确保调用者就是文件创造者)|O_TRUNC(如果存在就清空)|O_DIRECTORY(打开一个目录,如果前面的路径需要是目录)|O_NOATIME(不修改最后更新时间)|O_NOFOLLOW(不对符号链接操作),错误函数会返回-1,其中只读和只写和读写都可以和创建或使用(|)表示如果不存在则创建,只读只写只读写不可以一起用
read(fd,buf,size)返回成功读写的字节数,buf为缓冲区,注意输出buf时会多一些奇怪的字符,因为,buf是字符串,还需要在其末尾添加一个字符串结束符\0
write(fd,buf,size)
perror(string)打印错误信息string,已经文件操作返回值errno对应的信息,还有一个strerror(errno),返回对应errno对于的更多相关信息
lseek(fd,offset(偏移量),whence(开始位置))
☆ 欲将读写位置移到文件开头时:lseek(int fd,0,SEEK_SET)
☆ 欲将读写位置移到文件尾时:lseek(int fd,0,SEEK_END)
☆ 想要取得目前文件位置时:lseek(ind fd,0,SEEK_CUR)
#include<stdio.h>
#include<errno.h>
#include<fcntl.h>
#include<string.h>
int main(){
    int fp;
    char bp;
    scanf("%s",bp);;
    fp=open("aaa",O_WRONLY);
    perror("open fail");
    lseek(fp,10,0);//其实位置为开头,偏移量为10
    write(fp,bp,strlen(bp));
    perror("write fail");
    close(fp);
return 0;}
还有一个文件创建函数creat(),它的函数原型是int creat(const char *pathname,int perms)
close(fd)关闭文件
pread(fd,buf,count,offset)其中offset为偏移量,与read函数不同,该函数执行后也不会改变当前偏移量
pwrite(fd,buf,count,offset) 这两个都是原子操作,不可中断,一次性完成
readv(fd,const struct iovec *iov,count)依次填充count个结构体,成功的话会返回读取的数据字节数,注意,如果返回的值不足,说明结构体还有部分没有填充完
writev(fd,const struct iovec *iov,count) 这两个都是原子操作,不可中断,一次性完成
preadv(fd,const struct iovec *iov,count,offset)
pwritev(fd,const struct iovec *iov,count,offset) 跟上面两个函数差不多,不过多了个偏移量,这个对于某些操作很方便
truncate(filename,length)这个很6,不需要open就能直接对文件操作
ftruncate(fd,length)注意fd都是指文件描述符,filename就是文件路径,两个函数都是截取文件长度,如果文件长度大于length,截除后面多余的,如果小于就添加一系列空字符或者文件空洞
如果需要操作大于2个g的文件,需要在宏定义#define _FILE_OFFSET_BITS 64
创建临时文件
mkstemp(path),path为字符数组,生成一个唯一文件名并打开该文件,要求最后六个字符必须为XXXXXX,然后使用unlink(path)删除这些文件
temfile()也可以创建临时文件,用法未知
./a.out result.dat 2>&1重定向标准输出和标准错误到result.dat
下面这两个程序都是自己乱写的,主要是用来练手用的,把这些函数都实践一下罢了
#include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 int main(){
      5   FILE *fp,*fp1,*fp2,*fp3;
      6   char ch,str;
      7   fp=fopen("aaa","w");
      8   if(fp==NULL)
      9         printf("there is some erro\n");
   10   else
   11         while((ch=getchar())!=EOF){
   12             fputc(ch,fp);
   13         }
   14   fp1=fopen("bbb","r");
   15   if(fp1==NULL)
   16         printf("there is sothing wrong\n");
   17   else
   18         while((ch=fgetc(fp1))!=EOF)
   19             putchar(ch);
   20   if(fp1==NULL)
   21         printf("no this file for fp1\n");
   22   else
   23         while((fgets(str,10,fp1))!=NULL){//字符串长10
   24             printf("%s\n",str);
   25         }
   26   fp2=fopen("ccc","a");
   27   if(fp2==NULL)
   28         printf("no this file for fp2\n");
   29   else{
   30             scanf("%s",str);
   31             fputs(str,fp2);
   32         }
   33   fp3=fopen("linux.txt","w");
   34   fseek(fp3,10,0);//10是偏移量,0是原位置
   35   fputs("ooooooo",fp3);//在10位置后面插入字符串
   36 return 0;
   37 }
#include<errno.h>
#include<fcntl.h>
#include<string.h>
int main(){
    int fp,fp1,flags,flags1;
    char bp,tempname[]="/root/bp/kaliXXXXXX";
    mkstemp(tempname);
    sleep(5);//如果把程序放到后台运行,才能看到临时文件,因为程序一结束,临时文件自动删除
    unlink(tempname);
    scanf("%s",bp);;
    fp=open("aaa",O_WRONLY);
    fp1=open("bbb",O_WRONLY);
    flags=fcntl(fp,F_GETFL);
    flags1=fcntl(fp1,F_GETFL);//change fp1 to fp ,which can change fp file operation status ,such as add O_APPEND
    int accessmode=flags & O_ACCMODE;
    flags1 |=O_APPEND;
    fcntl(fp1,F_SETFL,flags1);
    write(fp1,"thisok",7);
    if(accessmode & O_WRONLY)
      printf("can write\n");
    else
      printf("flags fail\n");
    perror("open fail");
    lseek(fp,10,0);
    write(fp,bp,strlen(bp));
    perror("write fail");
    int fd1,fd2,fd3;
    fd1=open("a",O_WRONLY);
    fd2=dup(fd1);
    write(fd1,"kkk",4);
    write(fd2,"lll",4);//会在a文件后面添加lll字符串
    close(fp);
}
头文件介绍
关于头文件
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>最简单的方法就是进行文件操作的时候,把上面的头文件全部写进去
stdio.h所包含的函数:
文件访问
fopen
freopen
fflush
fclose
二进制输入/输出
fread
fwrite
非格式化输入/输出
fgetc/getc
fputc/putc
ungetc
fgets
fputs
格式化输入/输出
scanf/fscanf/sscanf
printf/fprintf/sprintf
perror
文件定位
ftell
fseek
fgetpos
fsetpos
rewind
错误处理
feof
ferror
文件操作
remove
rename
tmpfile
stdlib.h头文件
3.1 1函数名称:calloc
3.2 2函数名称:free
3.3 3函数名称:malloc
3.4 4函数名称: realloc
3.5 5函数名称: rand
3.6 6函数名称: abort
3.7 7函数名称: exit
3.8 8函数名称: getenv
3.9 9函数名称: putenv
3.10 10函数名称: labs
3.11 11函数名称: atof
3.12 12函数名称: atoi
3.13 13函数名称: atol
3.14 14函数名称:ecvt
3.15 15函数名称:fcvt



文档来源:51CTO技术博客https://blog.51cto.com/u_14590988/3151426
页: [1]
查看完整版本: C语言文件操作