C--文件管理(二)

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


一、格式化输入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二 重定向

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include "./include/io_utils.h"
#include "./include/time_utils.h"
#include <locale.h>

#if defined(__APPLE__) || defined(__linux__)//如果是苹果或linux系统
#  include <unistd.h>
#elif defined(_WIN32)
#  include <io.h>
#endif

void RedirectStdout(char const *filename) {
  static int saved_stdout_no = -1;//保存控制台的标准输出流

  if (filename) {
    //重定向标准输出流
    if(saved_stdout_no == -1) {
      //保存标准输出流
      saved_stdout_no = dup(fileno(stdout));
    }

    fflush(stdout);//把该输出到控制台的输出,后面一条语句将输出到文件
    freopen(filename, "a", stdout);
  } else {//恢复标准输出流
    if (saved_stdout_no != -1) {
      fflush(stdout);//将指向文件的输出flush掉,
      dup2(saved_stdout_no, fileno(stdout));// 让指向文件的输出流,从新指向控制台
      close(saved_stdout_no);
      saved_stdout_no = -1;
    }
  }
}

int main() {
  // 不成熟版本:以追加方式将控制台(stdout)内容放入outpu.log文件
//  freopen("output.log", "a", stdout);
//  puts("This will be written to file 'output.log'");
//  fclose(stdout);

  puts("1");//向控制台输出1
  RedirectStdout("output.log");//将stdout重定向到output.log文件
  puts("2");//向文件输出2
  RedirectStdout(NULL);//恢复输出到控制台
  puts("3");
  RedirectStdout("output.log");
  puts("4");
  RedirectStdout(NULL);
  puts("end");
  
 // python x.py > output.log 2>&1 将x.py重定向到output.log
  // 将2(错误)定向到(&1)控制台
  // python x.py > output.log 2>&1
  return 0;
}

三 文件随机定位

#include <stdio.h>
#include "./include/io_utils.h"
#include <locale.h>

int main() {
  FILE *file = fopen("CMakeLists.txt", "rb");  
  long position = ftell(file);
  PRINT_LONG(position);
  char buffer[128];
  fread(buffer, 1, 128, file);
  PRINT_LONG(ftell(file));
  fseek(file, 10, SEEK_SET);//从开始后移10
  PRINT_LONG(ftell(file));
  fseek(file, 10, SEEK_CUR);//从当前后移10
  PRINT_LONG(ftell(file));
  fseek(file, -10, SEEK_END);//从结尾前移10
  PRINT_LONG(ftell(file));
  fseek(file, 0, SEEK_END);
  PRINT_LONG(ftell(file));

  fclose(file);

  //不是所有文件流都支持随机定位 
  PRINT_LONG(ftell(stdout));
  perror("ftell(stdout)");

  return 0;
}

其他文件操作

#include <stdio.h>
#include "./include/io_utils.h"
#include <locale.h>
#include <sys/stat.h>

typedef struct __crt_stdio_stream_data
{
  union
  {
    FILE  _public_file;
    char* _ptr;
  };

  char*            _base;
  int              _cnt;
  long             _flags;
  long             _file;
  int              _charbuf;
  int              _bufsiz;
  char*            _tmpfname;

} WinFile;

long GetFileSize(char const *filename) {
  struct stat st;
  stat(filename, &st);
  return st.st_size;
}

int IsDirectory(char const *filename) {
  struct stat st;
  stat(filename, &st);
  return st.st_mode & S_IFDIR;
}

int main() {
//  int result = remove("data_copy/io_utils.h");
//  PRINT_INT(result);  // 0 删除成功
//  result = remove("data_copy/io_utils2.h");
//  PRINT_INT(result);  //-1 文件找不到

//utf8格式需要设置locale
  setlocale(LC_ALL, "zh_CN.utf-8");
  //重命名
//  rename("data_copy/三国演义.txt", "data_copy/sanguo.txt");
 
 //创建临时文件
//  FILE *file = tmpfile();
//  WinFile *win_file = (WinFile *) file;
//  puts(win_file->_tmpfname);
//  fclose(file);

//判断大小\是否是目录
  PRINT_LONG(GetFileSize("data/三国演义.txt"));
  PRINT_INT(IsDirectory("data/三国演义.txt"));
  PRINT_INT(IsDirectory("data"));
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值