系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 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;
}