文件比较和文件流

news2024/12/27 8:24:15

文件比较和文件流

    • 一、文本比较工具 diff
      • 1.基本用法
        • 1.1输出格式
      • 2.常用选项
    • 二、文件流
      • 1.文件的打开模式
      • 2.文件流的分类
        • ifstream
        • ofstream
        • fstrem
        • 区别
      • 3.文件流的函数
        • 1. 构造函数
        • 2. is_open 用于判断文件是否打开
        • 3. open
        • 4. getline
        • 5. close
        • 6. get()
        • 7. read
        • 8. write
        • 9. put
        • 10. gcount
        • 11. seekg
        • 12. peek
        • 13. ignore
        • 14. 文件流状态检查函数

一、文本比较工具 diff

  • diff 是 文件和内容比较工具,主要用于比较文件的差异、跟踪修改,以及生成补丁。这类工具可以比较文本文件、二进制文件、目录结构等,广泛用于开发、配置管理和系统运维中

1.基本用法

  • diff file1 file2 比较两个文件的差异
  • 输出:显示如何将 文件1 转换为 文件2,以最小的编辑操作实现
1.1输出格式

diff 的输出结果以 行号 和 更改说明 表示

  • <:表示 文件1 中的内容。表示第一个文件独有的行
  • >:表示 文件2 中的内容。表示第二个文件独有的行
[行号]动作[行号]
< 文件1中的行
---
> 文件2中的行
	动作:
		a(add):添加操作,将内容从 文件2 添加到 文件1。
		d(delete):删除操作,从 文件1 中删除内容。
		c(change):修改操作,将 文件1 的内容替换为 文件2 的内容。

在这里插入图片描述

2.常用选项

-u:生成统一格式(unified format)的输出,更易读
-r:递归比较目录
-i:忽略大小写差异
-w:忽略空白字符差异
-b:忽略空行差异
-y:以并排显示模式输出,其中| 表示此行有差异
--suppress-common-lines:隐藏相同的行,
可以生成补丁文件用于修改
	diff -u file1 file2 > patch.diff
#应用补丁 //file2是新文件,通过patch.diff的修改,给了file1
	patch file1.txt < patch.diff
#撤销补丁,使用R关键字
	patch -R file1.txt < patch.diff

二、文件流

  • C++的文件流
  • 头文件<fstream>
  • 允许程序通过文件进行输入(读取数据)和输出(写入数据)。它是 I/O 流库的一部分,主要通过 fstream 类和相关子类来实现。

1.文件的打开模式

  • 它们之间可以组合使用
打开模式描述
std::ios::in打开文件以进行输入(读取)(默认用于 ifstream)。如果文件不存在,则操作失败。
std::ios::out打开文件以进行输出(写入)(默认用于 ofstream)。如果文件不存在,则创建新文件;如果存在,则清空内容。
std::ios::app打开文件以追加内容到文件末尾。写入的数据保留原内容,不会清空文件。
std::ios::ate打开文件,并将文件指针定位到文件末尾(可同时进行读写操作)。
std::ios::trunc如果文件已存在,清空其内容(默认用于 ofstream)(仅在与 std::ios::out 结合使用时生效)。
std::ios::binary以二进制模式打开文件,而非文本模式。数据读写时不会进行格式转换。
std::ios::in | std::ios::out以读写模式打开文件,允许同时进行读取和写入操作。
std::ios::out | std::ios::app打开文件以追加模式写入,保留文件原内容,仅在末尾追加。
std::ios::in | std::ios::binary以二进制模式打开文件并读取数据。

2.文件流的分类

ifstream
  • 输入文件流,用于从文件中读取数据。
ofstream
  • 输出文件流,用于向文件中写入数据。
fstrem
  • 文件流,同时支持从文件读取数据和向文件写入数据(ifstream 和 ofstream 的结合)。
区别
  • 虽然 std::fstream 是通用的文件流,可以替代 std::ifstream 和 std::ofstream,但后两者的存在有以下好处
    - 明确性:更清楚地表达代码的意图。
    - 简洁性:减少代码复杂度,减少模式设置的错误。
    - 效率性:为单一任务设计,内部更优化。
    - 降低误用风险:避免由于未正确指定模式导致的运行时错误。

3.文件流的函数

1. 构造函数
explicit ifstream(const char* filename, ios_base::openmode mode = ios_base::in);
explicit ofstream(const char* filename, ios_base::openmode mode = ios_base::out);
explicit fstream(const char* filename, ios_base::openmode mode = ios_base::in | ios_base::out);

示例
	 std::ofstream outfile("example.txt", std::ios::out); // ofstream outfile("example.txt"); 
	/*
	std::ofstream outfile;
	outfile.open("example.txt",std::ios::out);//outfile.open("example.txt");
	*/
	std::ifstream infile("example.txt", std::ios::in); // ifstream infile("example.txt"); 
	/*
	std::ifstream infile;
	infile.open("example.txt", std::ios::in); // infile.open("example.txt");
	*/
	std::fstream file("example.txt", std::ios::in | std::ios::out); // fstream file("example.txt", ios::in | ios::out); 
	/*
	fstream 必须显式指定打开模式,不能省略 ios::in | ios::out。
	std::fstream file;
	file.open("example.txt", std::ios::in | std::ios::out); 
	*/
2. is_open 用于判断文件是否打开
bool is_open() const;
返回值
	返回 true:文件成功打开且未关闭
	返回 false:文件未打开或已关闭

用法
	// 场景1:检查文件是否成功打开
	if (!infile.is_open()) {
    std::cerr << "无法打开文件" << std::endl;
    return -1;
}
	// 场景2:循环读取多个文件
std::vector<std::string> filenames = {"file1.txt", "file2.txt", "file3.txt"};
for (const auto& filename : filenames) {
    std::ifstream file(filename);
    if (!file.is_open()) {
        std::cerr << "无法打开文件: " << filename << std::endl;
        continue;  // 跳过这个文件,继续处理下一个
    }
    // 处理文件...
    file.close();
}
3. open
  • 类似于标准文件打开
void open(const char* filename, ios_base::openmode mode = ios_base::in | ios_base::out);
// 或
void open(const string& filename, ios_base::openmode mode = ios_base::in | ios_base::out);

打开模式有如上表
示例
	fstream file;
    file.open("test.txt", ios::out | ios::in);
4. getline
  • getline函数用于从输入流中读取一行文本
// 形式1:从输入流读取到string
istream& getline(istream& is, string& str, char delim = '\n');

// 形式2:从输入流读取到字符数组
istream& getline(istream& is, char* str, streamsize n, char delim = '\n');
参数说明
	is: 输入流(如cin或文件流)
	str: 存储读取内容的字符串或字符数组
	delim: 分隔符(默认为换行符'\n')
	n: 最多读取的字符数(用于字符数组形式)
示例:
	// 1. 从标准输入读取一行
    string line;
    getline(std::cin, line);
     // 2. 使用自定义分隔符
    string data;
    getline(cin, data, ',');  // 以逗号为分隔符
     // 3. 从文件读取所有行
    ifstream file("test.txt");
    string textLine;
    while (getline(file, textLine)) {
        cout << textLine << endl;
    }

// 返回引用允许我们进行链式操作
string line1, line2;
getline(getline(cin, line1), line2);  // 连续读取两行
    
5. close
  • 关闭文件流
#include <fstream>
using namespace std;

int main() {
    ofstream file("test.txt");
    // 文件操作...
    file.close();  // 关闭文件
    return 0;
}
void processFile() {
    fstream file("test.txt");  // 打开文件
    // 文件操作...
    // 不需要显式调用close()
    // 当file离开作用域时会自动关闭
}  // 自动调用析构函数,关闭文件
6. get()
// 主要的几种形式:
int get();                                    // 形式1:读取单个字符
istream& get(char& ch);                       // 形式2:读取到字符引用
istream& get(char* str, streamsize n);        // 形式3:读取到字符数组
istream& get(char* str, streamsize n, char delim); // 形式4:带分隔符读取

示例
	// 逐字符读取文件
void readFileChar() {
    ifstream file("test.txt");
    char ch;
    while (file.get(ch)) {
        cout << ch;
    }
    file.close();
}

// 读取到特定字符为止
void readUntilChar(char delim) {
    char buffer[1024];
    cin.get(buffer, sizeof(buffer), delim);
    cout << "Read: " << buffer << endl;
}

// 处理二进制数据
void processBinaryData() {
    ifstream file("data.bin", ios::binary);
    char byte;
    while (file.get(byte)) {
        // 处理每个字节
        processBytes(byte);
    }
}
// 高效的文件读取
void efficientReading() {
    ifstream file("largefile.txt");
    constexpr size_t BUFFER_SIZE = 4096;
    char buffer[BUFFER_SIZE];
    
    while (file) {
        file.get(buffer, BUFFER_SIZE);
        // 处理buffer中的数据
    }
}
  • get()函数保留分隔符在流中
  • 读取字符数组时要注意留出空间给结束符’\0’
7. read
  • read 函数是一个重要的成员函数,用于以 二进制模式从文件中读取固定数量的字节。它非常适合处理 非文本文件(如图片、音频)或需要高效读取大量数据的场景
istream& read(char* buffer, streamsize count);
	char* buffer
		缓冲区的大小必须至少为 count,否则可能导致溢出。
		一个指向目标缓冲区的指针,读取的数据将存储在这个缓冲区中。
	streamsize count
		表示要从文件中读取的字节数。
		类型为 std::streamsize(通常是一个有符号整数类型)。
返回值
	返回对输入流对象的引用(istream&),支持链式操作。
	如果读取成功,流的状态仍然有效;如果读取失败(如到达文件末尾),流的状态会变为 "失败状态"。
示例
	int main() {
    ifstream file("test.bin", ios::binary);
    char buffer[100];
    
    // 读取100字节
    file.read(buffer, 100);
    
    // 检查实际读取的字节数
    cout << "读取了 " << file.gcount() << " 字节" << endl;
    
    file.close();
    return 0;
}
读取结构体
	struct Student {
    char name[50];
    int age;
    double score;
};

void readStudentData() {
    ifstream file("students.dat", ios::binary);
    Student student;
    
    // 读取整个结构体
    file.read(reinterpret_cast<char*>(&student), sizeof(Student));
    
    cout << "姓名: " << student.name << endl;
    cout << "年龄: " << student.age << endl;
    cout << "分数: " << student.score << endl;
}
// 读取大文件
void readLargeFile(const string& filename) {
    ifstream file(filename, ios::binary);
    constexpr size_t BUFFER_SIZE = 4096;
    char buffer[BUFFER_SIZE];
    
    while (file) {
        file.read(buffer, BUFFER_SIZE);
        streamsize bytesRead = file.gcount();
        if (bytesRead > 0) {
            // 处理读取的数据
            processData(buffer, bytesRead);
        }
    }
}

// 读取数组
void readArray() {
    ifstream file("numbers.dat", ios::binary);
    int numbers[100];
    
    file.read(reinterpret_cast<char*>(numbers), 
              sizeof(int) * 100);
}

// 读取固定大小的记录
struct Record {
    int id;
    char data[256];
};

void readRecord(int position) {
    ifstream file("records.dat", ios::binary);
    Record record;
    
    // 定位到特定记录
    file.seekg(position * sizeof(Record));
    file.read(reinterpret_cast<char*>(&record), 
              sizeof(Record));
}
8. write
  • write() 函数是一个用于二进制写入的低级函数,它属于 ostream 类(因此也被 ofstream 继承)。
ostream& write(const char* buffer, streamsize count);
参数
	buffer:指向要写入数据的字符缓冲区
	count:要写入的字节数
	返回对流对象的引用,支持链式操作
	按照原始二进制格式写入,不进行任何转换
示例
//写入字符串
ofstream file("test.bin", ios::binary);
const char* str = "Hello";
file.write(str, 5); // 写入5个字节

//写入数值
int number = 42;
file.write(reinterpret_cast<const char*>(&number), sizeof(number));

//写入结构体
struct Person {
    char name[20];
    int age;
};

Person person = {"John", 25};
file.write(reinterpret_cast<const char*>(&person), sizeof(Person));

//写入数组
int arr[] = {1, 2, 3, 4, 5};
file.write(reinterpret_cast<const char*>(arr), sizeof(arr));

//图像文件处理

class ImageProcessor {
    struct BMPHeader {
        char signature[2];
        uint32_t fileSize;
        uint32_t reserved;
        uint32_t dataOffset;
        // ... 其他头部信息
    };

public:
    static void convertToBW(const std::string& filename) {
        std::fstream file(filename, std::ios::binary | std::ios::in | std::ios::out);
        
        BMPHeader header;
        file.read(reinterpret_cast<char*>(&header), sizeof(header));
        
        // 定位到图像数据
        file.seekg(header.dataOffset);
        
        std::vector<unsigned char> pixels;
        pixels.resize((header.fileSize - header.dataOffset));
        file.read(reinterpret_cast<char*>(pixels.data()), pixels.size());
        
        // 转换为黑白
        for (size_t i = 0; i < pixels.size(); i += 3) {
            unsigned char gray = (pixels[i] + pixels[i+1] + pixels[i+2]) / 3;
            pixels[i] = pixels[i+1] = pixels[i+2] = gray;
        }
        
        // 写回文件
        file.seekp(header.dataOffset);
        file.write(reinterpret_cast<char*>(pixels.data()), pixels.size());
    }
};
9. put
  • put() 函数用于写入单个字符,属于 ostream 类
ostream& put(char ch);
参数
    ch:要写入的字符
    返回对流对象的引用,支持链式操作
示例
//写入单个字符
ofstream file("test.txt");
file.put('A');

//链式写入多个字符
file.put('H').put('i').put('!');

//配合循环使用
const char* str = "Hello";
for(int i = 0; str[i]; i++) {
    file.put(str[i]);
}

//写入特殊字符
file.put('\n');  // 换行符
file.put('\t');  // 制表符
10. gcount
  • gcount() 函数返回上一次输入操作读取的字符数,属于 istream 类
treamsize gcount() const;
参数
    返回值:返回上一次读取操作实际读取的字符数
示例
//基本使用
ifstream file("test.txt");
char buffer[100];
file.read(buffer, 100);
cout << "读取了 " << file.gcount() << " 个字符" << endl;

//配合getline使用
string line;
getline(file, line);
cout << "本行读取了 " << file.gcount() << " 个字符" << endl;

//错误检查
if (file.read(buffer, 100) && file.gcount() > 0) {
    cout << "成功读取数据" << endl;
}

//读取整个文件
ifstream file("data.bin", ios::binary);
vector<char> data;
while (file.read(buffer, sizeof(buffer))) {
    data.insert(data.end(), buffer, buffer + file.gcount());
}
11. seekg

seekg() 函数用于设置输入流的读取位置,属于 istream 类

istream& seekg(streampos pos);  // 绝对定位
istream& seekg(streamoff off, ios_base::seekdir way);  // 相对定位
参数
    pos:新的绝对位置
    off:相对偏移量
    way:移动方向(ios::beg开头,ios::cur当前,ios::end末尾)
示例
//移动到文件开头
ifstream file("test.bin", ios::binary);
file.seekg(0, ios::beg);

//移动到文件末尾
file.seekg(0, ios::end);

//获取文件大小
file.seekg(0, ios::end);
streampos fileSize = file.tellg();
file.seekg(0, ios::beg);

//跳过文件头
struct Header {
    int version;
    int dataSize;
};
file.seekg(sizeof(Header), ios::beg);

//读取文件中间的数据块
file.seekg(1024, ios::beg);  // 跳过前1024字节
char buffer[256];
file.read(buffer, 256);

//在文件中来回移动
int pos = file.tellg();  // 保存当前位置
file.seekg(100, ios::cur);  // 向前移动100字节
file.seekg(pos);  // 返回之前的位置
12. peek

peek() 函数用于查看输入流中的下一个字符,但不从流中提取它

int peek();
返回值
    成功:返回下一个要读取的字符
    失败:返回 EOF
    不移动流位置指针

示例
//基本使用
ifstream file("test.txt");
char next = file.peek();
cout << "下一个字符是: " << next << endl;

//用于判断行尾
while (file.peek() != EOF && file.peek() != '\n') {
    char ch;
    file.get(ch);
    cout << ch;
}

//检查数字开头
if (isdigit(file.peek())) {
    int number;
    file >> number;
}

//格式化读取示例
class Parser {
public:
    static void parseData(istream& input) {
        while (input.peek() != EOF) {
            // 跳过空白字符
            while (isspace(input.peek())) {
                input.ignore();
            }
            
            if (isdigit(input.peek())) {
                int num;
                input >> num;
                cout << "Found number: " << num << endl;
            }
            else if (isalpha(input.peek())) {
                string word;
                input >> word;
                cout << "Found word: " << word << endl;
            }
        }
    }
};
13. ignore
  • ignore() 函数用于跳过输入流中的字符
istream& ignore(streamsize n = 1, int delim = EOF);
参数
    n: 要忽略的最大字符数,默认为1
    delim: 分隔符,读到这个字符就停止,默认为EOF
    返回对流的引用

示例
//忽略单个字符
ifstream file("test.txt");
file.ignore();  // 跳过一个字符

//忽略整行
file.ignore(numeric_limits<streamsize>::max(), '\n');

//跳过特定字符前的所有内容
file.ignore(numeric_limits<streamsize>::max(), ':');

//清除缓冲区
cin.ignore(numeric_limits<streamsize>::max(), '\n');

//处理CSV文件示例
class CSVParser {
public:
    static vector<string> parseLine(istream& input) {
        vector<string> fields;
        string field;
        
        while (input.peek() != EOF && input.peek() != '\n') {
            if (input.peek() == ',') {
                input.ignore();  // 跳过逗号
                fields.push_back(field);
                field.clear();
            }
            else {
                char ch;
                input.get(ch);
                field += ch;
            }
        }
        
        if (!field.empty()) {
            fields.push_back(field);
        }
        
        input.ignore();  // 跳过换行符
        return fields;
    }
};

//配合peek()实现高级解析
class DataParser {
public:
    static void parseStructuredData(istream& input) {
        while (input.peek() != EOF) {
            // 跳过注释行
            if (input.peek() == '#') {
                input.ignore(numeric_limits<streamsize>::max(), '\n');
                continue;
            }
            
            // 处理数据行
            string data;
            getline(input, data);
            processData(data);
        }
    }
    
    static void skipWhitespace(istream& input) {
        while (input.peek() != EOF && isspace(input.peek())) {
            input.ignore();
        }
    }
    
    static string readToken(istream& input) {
        skipWhitespace(input);
        
        string token;
        while (input.peek() != EOF && !isspace(input.peek())) {
            char ch;
            input.get(ch);
            token += ch;
        }
        
        return token;
    }
};
14. 文件流状态检查函数
  • 返回值都是bool类型
good()	检查流是否处于良好状态(没有错误)。
eof()	检查是否到达文件末尾。
fail()	检查是否发生了文件流错误(如文件打开失败)。
bad()	检查是否发生了严重错误(如硬件故障)。
clear()	清除流的所有错误状态标志。
//基本检查
ifstream file("data.txt");
if (file.good()) {
    cout << "文件流状态正常" << endl;
}
//读取整个文件
ifstream file("input.txt");
string content;
while (!file.eof()) {
    char ch;
    file.get(ch);
    if (!file.eof()) {  // 重要:避免重复最后一个字符
        content += ch;
    }
}
//文件打开检查
ifstream file("config.txt");
if (file.fail()) {
    cerr << "无法打开配置文件" << endl;
    return;
}

//类型转换错误检查
int number;
cin >> number;
if (cin.fail()) {
    cerr << "输入的不是有效数字" << endl;
    cin.clear();  // 清除错误状态
    cin.ignore(numeric_limits<streamsize>::max(), '\n');  // 清除错误输入
}
//硬件错误检查
ofstream file("data.dat", ios::binary);
file.write(data, size);
if (file.bad()) {
    cerr << "发生严重的I/O错误" << endl;
    return;
}
//基本使用
ifstream file("data.txt");
if (file.fail()) {
    file.clear();  // 清除错误状态
}

//恢复流状态
class StreamResetter {
public:
    static void resetStream(istream& stream) {
        stream.clear();  // 清除所有错误标志
        stream.seekg(0, ios::beg);  // 重置读取位置
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ECharts创建带百分比标注的环形图

在数据可视化领域&#xff0c;环形图是一种非常有效的图表类型&#xff0c;它能够清晰地展示各部分与整体的关系。今天&#xff0c;我们将通过ECharts来创建一个带百分比标注的环形图&#xff0c;并详细解释如何实现这一效果。 1. 数据准备 首先&#xff0c;我们定义了一些基础…

win10环境mysql8.4免安装版配置

下载后解压 dos管理员&#xff0c;进入bin目录 mysqld -install net start mysql 出现错误&#xff0c;服务无法启动 MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。 请键入 NET HELPMSG 3534 以获得更多的帮助。 services.msc&#xff0c;查看服务…

时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =

vue3项目中使用星火API

在node环境epxress中使用讯飞ai接口进行二次封装&#xff0c;通过ai对话回复提取&#xff0c;获得ai提取的文章摘要 本文章只是简单使用&#xff0c;更复杂功能比如调用星火API制作对话机器人可以查看文档&#xff0c;对于初次使用星火AI接口或许有帮助 讯飞星火大模型API-大模…

Leetcode - 周赛425

目录 一&#xff0c;3364. 最小正和子数组 二&#xff0c; 3365. 重排子字符串以形成目标字符串 三&#xff0c;3366. 最小数组和 四&#xff0c;3367. 移除边之后的权重最大和 一&#xff0c;3364. 最小正和子数组 本题可以直接暴力枚举&#xff0c;代码如下&#xff1a; …

linux系统信号简介

原文地址&#xff1a;linux系统信号简介 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 信号是一种重要的进程间通讯方式&#xff0c;这些信号有的有特定的用法&#xff0c;有的可作为扩展和自定义使用。并且大多数信号是可以被重新定义…

Linux 各个目录作用

刚毕业的时候学习Linux基础知识&#xff0c;发现了一份特别好的文档快乐的 Linux 命令行&#xff0c;翻译者是happypeter&#xff0c;作者当年也在慕课录制了react等前端相关的视频&#xff0c;通俗易懂&#xff0c;十分推荐 关于Linux的目录&#xff0c;多数博客已有详细介绍…

JavaScript对象笔记

JavaScript对象笔记 什么是JavaScript对象 JavaScript对象是一组键值对的集合&#xff0c;其中键是字符串&#xff08;通常是字符串&#xff0c;但也可以是符号&#xff09;&#xff0c;值可以是任何数据类型。 特点 动态性&#xff1a;可以在运行时添加、删除或更改属性。灵…

如何快速使用Unity 的UPR---1资源检测保姆级

关于我们的性能检测工具已经有很多了&#xff0c;比如UWA的或者是我们的Unity 的UPR 都是很好的&#xff0c;今天说一下UPR吧 官方网址 &#xff1a;UPR - Unity专业性能优化工具 这个是官方给的Demo 选择你的平台就可以 这个可以作为一个参考但是不是很建议用官方的因为我们…

Qt桌面应用开发 第九天(综合项目一 飞翔的鸟)

目录 1.鸟类创建 2.鸟动画实现 3.鼠标拖拽 4.自动移动 5.右键菜单 6.窗口透明化 项目需求&#xff1a; 实现思路&#xff1a; 创建项目导入资源鸟类创建鸟动画实现鼠标拖拽实现自动移动右键菜单窗口透明化 1.鸟类创建 ①鸟类中包含鸟图片、鸟图片的最小值下标和最大值…

【实体配置】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

Pytorch-GPU版本离线安装

最近在复现一项深度学习的工作&#xff0c;发现自己的pytorch是装的cpu版的(好像当时是直接加清华源&#xff0c;默认是cpu版本&#xff09;。从官网在线下载速度太慢&#xff0c;还时不时断开连接&#xff0c;我们可以配置conda的清华源去这个问题&#xff0c;但是考虑到是在用…

聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

一、触发器(Trigger) Trigger 决定了一个窗口&#xff08;由 window assigner 定义&#xff09;何时可以被 window function 处理。 每个 WindowAssigner 都有一个默认的 Trigger。 如果默认 trigger 无法满足你的需要&#xff0c;你可以在 trigger(…) 调用中指定自定义的 tr…

[Redis#12] 常用类型接口学习 | string | list

目录 0.准备 1.string get | set set_with_timeout_test.cpp set_nx_xx_test.cpp mset_test.cpp mget_test.cpp getrange_setrange_test.cpp incr_decr_test.cpp 2.list lpush_lrange_test.cpp rpush_test.cpp lpop_rpop_test.cpp blpop_test.cpp llen_test.cpp…

网络安全之IP伪造

眼下非常多站点的涉及存在一些安全漏洞&#xff0c;黑客easy使用ip伪造、session劫持、xss攻击、session注入等手段危害站点安全。在纪录片《互联网之子》&#xff08;建议搞IT的都要看下&#xff09;中。亚伦斯沃茨&#xff08;真实人物&#xff0c;神一般的存在&#xff09;涉…

Spring Web开发(请求)获取JOSN对象| 获取数据(Header)

大家好&#xff0c;我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…

(SAST检测规则-1)Android - 权限管理漏洞

所属分类&#xff1a;Android - 权限管理漏洞缺陷详解&#xff1a;应用未正确实施最小权限原则或滥用已声明的权限可能导致敏感信息泄露。例如&#xff0c;恶意代码利用已授予的权限绕过用户授权&#xff0c;访问通讯录、位置、短信等敏感资源。部分开发者还可能滥用权限以执行…

EC2还原快照

EC2还原快照 AWS EC2 磁盘快照 是您 Amazon Elastic Block Store (EBS) 卷在特定时间点的增量备份。您可以使用快照创建 EBS 卷的副本&#xff0c;以便在出现故障时恢复数据或将数据迁移到其他区域。 创建磁盘快照 找到ec2实例挂载的磁盘&#xff0c;直接选择创建快照 等待创建…

oracle RAC各版本集群总结和常用命令汇总

oracle RAC学习 RAC介绍 RAC&#xff1a;高可用集群&#xff0c;负载均衡集群&#xff0c;高性能计算集群 RAC是⼀种⾼可⽤&#xff0c;⾼性能&#xff0c;负载均衡的share-everything的集群 8i:内存融合雏形 内存融合雏形&#xff08;Oracle Parallel Server&#xff09;…

【聚类】K-Means 聚类(无监督)及K-Means ++

1. 原理 2. 算法步骤 3. 目标函数 4. 优缺点 import torch import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.decomposition import PCA import torch.nn as nn# 数据准备 # 生成数据&#xff1a;100 个张量&#xff0c…