c语言文件操作笔记

文件是什么:文件时存储数据的载体
为了有效、方便地组织和管理文件,常按照不同的观点对文件进行分类。文件分类方法有很多,下面是常用的几种文件分类方法。
(1)按照文件的逻辑结构的不同,可以把文件分成流式文件和记录式文件。构成流式文件的基本单位是字符或字节,如ASCII码文件或者二进制文件;构成记录式文件的基本单位是记录,一条记录又由若干个数据项构成。这实质是从用户角度看到的文件的逻辑结构.也可以按照物理结构对文件进行分类。
(2)按照用途将文件分为系统文件、库文件和用户文件。系统文件:由系统软件构成的文件。
①包括操作系统内核、编译程序文件等。这些通常都是可执行的二进制文件,只允许用户使用,不允许用户修改.
②库文件:由标准的和非标准的子程序库构成的文件.标准的子程序库通常称为系统库,提供对系统内核的直接访问,而非标准的子程序库则是提供满足特定应用的库。库文件又分为两大类:一类是动态链接库,另一类是静态链接库。
③用户文件:用户自己定义的文件,如用户的源程序、可执行程序和文档等。
(3)按照性质可以把文件分为普通文件、目录文件和特殊文件。
①普通文件:系统所规定的普通格式的文件,例如字符流组成的文件,它包括用户文件、库函数文件、应用程序文件等。
②目录文件:包含普通文件与目录文件的属性信息的特殊文件。主要是为了更好地管理普通文件与目录文件。
③特殊文件:在UNIX系统中,所有的输人/输出设备都被看做特殊的文件,主要包括块设备文件和字符设备文件。特殊文件在使用形式上和普通文件相同,通过对特殊文件的操作即可完成相应设备的操作。例如文件/dev/lp表示打印机设备。特殊文件可以把所有I/O设备统一在文件系统下,那么用户就可以用统一的观点看待和处理驻留在不同存储介质上的信息,系统也可以对设备和文件实施统一的管理,从而简化设备管理和文件管理的接口设计。
(4)按照保护级别将文件分为只读文件、只写文件、可读可写文件、可执行文件和不保护文件等。例如只读文件只允许授权用户读,但不能写。
(5)按照文件数据的形式将文件分为源文件、目标文件和可执行文件.
(6)按照保存期限可以分为临时文件和永久文件。除了以上的分类方法外,还可以按照文件的其他属性进行分类.文件的分类主要便于对不同文件进行有针对性的管理,从而提高操作系统的性能.例如,系统文件在装入内存后将被放在主存的系统专用区且享受高的保护级别,而不必像一般用户文件那样只有在内存用户空间分得相应的空闲区之后才能被装入。

Linux内文件的分类有:
-rw-r–r-- 1 root root 1658 6月 18 14:25 hello.c
-:普通文件
b: block 块设备文件
c:char 字符设备文件
d: directory 目录文件
l: link 链接文件
p: pipe 管道文件
s: socket 套接字文件

颜色辨别文件:
黑色:普通文件
绿色:可执行文件
红色: 打包文件
黄色:设备文件
白色:普通文件
蓝色:目录文件
浅蓝:链接文件

文件的操作:
文件流:指的是针对文件进行对写操作的过程
输入文件流:
从输入设备到输入数据到内存的过程
输出文件流:.
从输出设备到输出数据到内存的过程
流是操作文件的一种标识
文件操作的过程可以分为一下几步:
1、创建打开文件
2、读写数据
3、关闭文件
fopen:基于缓冲区的文件操作
FILE *stream:文件指针结构体,该结构体内部包含了文件操作的先关成员
关于函数的学习:
通过man指令
man 指令
man 函数
man默认查找的是指令的使用方式,当遇到既是指令又是函数的
字符串的时候默认查找的是指令使用,若想查看对应的函数的使用方式通过“man 页数 名字”
man printf —默认显示的是printf指令
man 2 printf —显示的是printf函数
1、文件的打开

#include <stdio.h>
FILE *fopen(const char *path, const char *mode);

系统函数关注的点:
形参、返回值
const char *path: 打开文件的路径名
const char *mode: 打开文件的方式
The fopen() function opens the file whose name
is the string pointed to by path and asso‐
ciates a stream with it.
The argument mode points to a string beginning
with one of the following sequences
r
以只读的方式打开文件,文件的光标位置位与文件的开头
r+
以可读可写的方式打开文件,文件的光标位置位与文件的开头
w
以只写的方式打开文件,打开文件的同时会清空文件,或者文件不存在的时候
先创建文件再以只写方式打开文件光标的位置位于文件的的开头
w+
以只写的方式打开文件,打开文件的同时会清空文件,或者文件不存在的时候
先创建文件再以只写方式打开文件光标的位置位于文件的的开头
a
以追加的方式打开文件,写的时候从文件的末尾,若文件不存在先创建,文件的光标位
于文件的末尾
a+
以追加的方式打开文件,写的时候从文件的末尾,若文件不存在先创建,文件的光标位
于文件的末尾
以读或写的方式打开文件,写的时候从文件的末尾,读的时候从文件的开头,若文件不存在
先创建,文件的光标位于文件的末尾

fclose:保存文件并将文件的光标移动到文件的开头

文件的读写:
字符的读写:
getchar:
int getchar(void);
从键盘获取单个字符并返回到返回值
int fgetc(FILE *stream);
从任意文件夹流获取单个字符并返回
int getc(FILE *stream);
从键盘获单个字符

返回值字符的对应的十进制数据
putchar:

   #include <stdio.h>

   int fputc(int c, FILE *stream);
   int c:待输出的字符 (ascii对应的十进制)
   FILE *stream:输出到的字节流(可以是文件,可以是标准输出 设备)
   向任意文件流输出单个字符C
   int putc(int c, FILE *stream);

向任意文件流输出单个字符C
int putchar(int c);
int c:待输出的字符 (ascii对应的十进制)
向屏幕输出单个字符C
返回值: 返回字符对应的ascii
feof:判断文件光标是否到文件的结尾
int feof(FILE *stream);
FILE *stream:文件流指针
检测文件光标的位置是否处于文件的末尾,是的话返回非0不是返回0

#include <stdio.h>
int main(int argc, char const* argv[])
{
  int ch=' ';
  FILE *fp=fopen(argv[1],"r");
  if(fp==NULL)
  {
    perror("fopen");
    return -1;
  }
  else {
    printf("fopen success\n");
  }
  while(!feof(fp))
  {
     ch=fgetc(fp);
     if(ch==EOF)
         break;
    fputc(ch,stdout);
    
  } 
  fclose(fp);
  return 0;
}

字符串读写:
char *fgets(char *s, int size, FILE *stream);
char *s:用来保存读取字符串的首地址
int size:保存字符串空间的大小
FILE *stream:任意输入文件流

#include <stdio.h>
int main(int argc, char const* argv[])
{
  int ret=0;
  char *p=NULL;
  char buf[20]={0};
  FILE *fp=fopen(argv[1],"r");
  if(fp==NULL)
  {
    perror("fopen");
    return -1;
  }
  else {
    printf("fopen success\n");
  }
  while(!feof(fp))
  {
    p=fgets(buf,20,fp);
    if(p==NULL)
    {
      perror("fgets");
      break;
    }
    fputs(buf,stdout);
  } 
  fclose(fp);
  return 0;
}

格式化读写:
按照指定的格式控制输出或者输入
格式化输出:
#include <stdio.h>

int printf(const char *format, …);
int fprintf(FILE *stream, const char *format, …);
fprintf的功能是直接将数据按照format指定的格式输出到stream对应的文件流中
printf属于fprintf的一个特殊使用方式,只针对标准输出设备,而fprintf针对所有
输出文件流
int sprintf(char *str, const char *format, …);
sprintf的功能是直接将数据按照format指定的格式输出到str指向的空间内
int snprintf(char *str, size_t size, const char
*format, …);

#include <stdio.h>
int main(int argc, char const* argv[])
{
  printf("%d\n",printf("%d\n",printf("%d\n",43)));
  fprintf(stdout,"%d\n",fprintf(stdout,"%d\n",fprintf(stdout,"%d\n",43)));

  return 0;
}
#include <stdio.h>
int main(int argc, char const* argv[])
{
  char buf[50]=" ";
  int version=0;
  scanf("%d",&version);
  sprintf(buf,"this is prudect varsion %d",version);
  printf("%s\n",buf);
  return 0;
}
#include <stdio.h>
int main(int argc, char const* argv[])
{
  FILE *fp=fopen(argv[1],"a");
  if(fp==NULL)
  {
    perror("fopen");
    return -1;
  }
  fprintf(fp,"%d\n",fprintf(fp,"%d\n",fprintf(fp,"%d\n",43)));
  fclose(fp);
  return 0;
}

格式化输入:

#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);

#include <stdio.h>
int main(int argc, char const* argv[])
{
  int ret=0;
  char *p=NULL;
  char buf[20]={0};
  FILE *fp=fopen(argv[1],"r");
  FILE *fp1=fopen(argv[2],"a");
  if(fp==NULL || fp1==NULL)
  {
    perror("fopen");
    return -1;
  }
  else {
    printf("fopen success\n");
  }
  while(!feof(fp))
  {
    fscanf(fp,"%c",buf);
    fprintf(fp1,"%s",buf);
  } 
  fclose(fp);
  return 0;
}

块读块写:
fread:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
void ptr: 用来保存获取到的字符串的首地址,大于sizenmemb
size_t size:每块字符的大小
size_t nmemb: 块数
FILE *stream:文件流

#include <stdio.h>
int main(int argc, char const* argv[])
{
  int ret=0;
  char *p=NULL;
  char buf[1024]={0};
  FILE *fp=fopen(argv[1],"r");
  FILE *fp1=fopen(argv[2],"a");
  if(fp==NULL || fp1==NULL)
  {
    perror("fopen");
    return -1;
  }
  else {
    printf("fopen success\n");
  }
  fread(buf,128,8,fp);
  fwrite(buf,128,8,fp1);
  fclose(fp);
  fclose(fp1);
  return 0;
}

文件指针定位:
fseek:
#include <stdio.h>
格式:
int fseek(FILE *stream, long offset, int whence);
文件流 偏移字节数 起始位在哪

fseek的功能是重新定位文件光标的位置,新的位置的获取通过offset+whence
whence:
SEEK_SET:将文件光标移动到开头,此时的offset的值只能为正数,只能向后偏移
SEEK_CUR:文件光标位置处于当前位置,(中间任意位置),offset的值可正可负
SEEK_END:将文件光标移动到结尾,此时的offset的值只能为负数,只能向前偏移
long ftell(FILE *stream);
获取文件偏移的字节数

#include <stdio.h>
int main(int argc, char const* argv[])
{
  int ret=0;
  int len=0;
  char *p=NULL;
  char buf[1024]={0};
  FILE *fp=fopen(argv[1],"r");
  FILE *fp1=fopen(argv[2],"a");
  if(fp==NULL || fp1==NULL)
  {
    perror("fopen");
    return -1;
  }
  else {
    printf("fopen success\n");
  }
  fseek(fp,0,SEEK_END);
  len=ftell(fp);
  rewind(fp);
  fread(buf,len,1,fp);
  fwrite(buf,len,1,fp1);
  fclose(fp);
  fclose(fp1);
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值