Linux IO

C语言标准IO

一、FILE *fopen(const char *path, const char *mode)

打开文件

  1. 成功,返回值FILE*
  2. 失败返回NULLperrer("fopen()");
  3. 返回失败如果exit,要调用fcloes()关闭,防止内存泄露,
    fopen的实现在堆中申请内存,mallco 了一块内存 存放FILE* 返回 FILE*
  4. fopen()最多能成功打开的文件个数,一般情况1024个,前3个是stdin,stdout,stderr
  5. 可以用ulimit命令来限制最大打开个数,比如ulimit -n 512

二、int fgetc(FILE* stream)

  • 从流中读取一个字符,读取后光标后移一个位置
  • 返回值是int 成功返回字母转成的int,到结尾或读取失败返回EOF
  • 相反的就是fputc(int c , FILE* stream)
  • putchar(int c)和putc(int c,FILE*stream) 和fputc类似
  • 不要用gets(),因为它不检查缓冲区溢出,可以用fgets()代替
  • puts()和fputs()类似
  • size_t fread(void* ptr,size_t size,size_t nmemb,FILE* stream)
    • nmemb 就是一次最少读对象的个数,fread(buff,1,10,fp)如果fp里只有5个char,返回5,fread(buff,10,1,fp)这个就是返回0
  • size_t fwrite(const void *ptr, size_t size, size_t nmemb,
    FILE *stream);

三、int printf(const char *format, …)

  • int fprintf(FILE *stream, const char *format, …)

  • printf是行缓冲模式,如果不加\n,就要等下次出现\n,或者程序结束时候才输出,也可以强制刷新缓冲区fflush(stdout)

  • int dprintf(int fd, const char *format, …)

  • int sprintf(char *str, const char *format, …)

  • int snprintf(char *str, size_t size, const char *format, …)

  • sacnf()

四、int fseek(FILE *stream, long offset, int whence)

  • 返回值 成功0,失败-1
  • whence起始位置,offset是偏移量fseek(fp,-10,SEEK_CUR)表示当前位置往前10个字符
  • 在文本模式中,只有以下调用能保证其相应的行为。
函数调用效果
fseek(file, 0L, SEEK_SET)定位至文件开始处
fseek(file, 0L, SEEK_CUR)保持当前位置不动
fseek(file, 0L, SEEK_END)定位至文件结尾
fseek(file,ftell-pos, SEEK_SET)到距文件开始处ftell-pos的位置,ftell-pos是ftell()的返回值
  • long ftell(FILE *stream)
  • long offset 限制的long最大为2G
  • int fseeko(FILE *stream, off_t offset, int whence) 这个就不限制了
  • off_t ftello(FILE *stream)
  • #define _FILE_OFFSET_BITS 64 用这个定义可以把off_t定义为64位
  • 可以在makefile里写上面的宏 CFLAGS+=-D_FILE_OFFSET_BITS=64

五、ssize_t getline(char **lineptr, size_t *n, FILE *stream)

  • ssize_t 是有符号整形,相当于int或者long int
  • 返回值 成功 返回读取字符数量 失败 -1
  • 写一个读取文件行数的例子
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char** argv)
{
  if(argc<2)
  {
    fprintf(stderr,"%s 读取文件名出错\n",argv[0]);
    fprintf(stderr,"格式:%s <文件名>\n",argv[0]);
    exit(EXIT_SUCCESS);
  }
  //打开文件
  FILE* fp = fopen(argv[1],"r");
  if(fp==NULL)
  {
    perror("fopen()");
    exit(EXIT_FAILURE);
  }
  //读取行
  char* buff=NULL;
  size_t n=0,count=0;
  while(getline(&buff,&n,fp)!=-1)
    count++;

  printf("%s有%d行内容\n",argv[1],count);
  free(buff);
  fclose(fp);
  return 0;
}

六、临时文件

  • FILE* tempfile(void)
    • 该函数创建临时文件,以二进制读写方式打开,创建的文件存储在默认文件目录,结束后会删除,返回值,成功返回指向该文件的指针,失败返回NULL
  • 这个临时文件可以fclose关闭,或者return 0,或者exit(0)结束,属于可控内存泄漏不像fopen,只打开不关闭的话打开文件数量是有上限的
  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yerennuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值