2023/12/5 I/O流

流:数据从一个对象传到另一个对象。输出流是数据从内存传送到某个载体或设备中,输入流从某个载体输入到内存。(类似于单片机那个IO口?)

 

 

 字符串流    #include"strstrea.h"

 文件流:#include <fstream.h>

                ifstream ifile;//输入ofstream ofile;//输出fstream iofile;//输入/输出

建立文件流对象的同时打开文件:

ifstream inputFile("1.txt");
ofstream outputFile("2.txt");

 

 打开的文件使用完毕,必须使用close函数关闭。

    inputFile.close();
    outputFile.close();

 

获得和设置流指针(get and put stream pointers)

所有输入/输出流对象(i/o streams objects)都有至少一个流指针:

  • ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。
  • ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。
  • fstream, 类似 iostream, 同时继承了get 和 put

我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:

  • tellg() 和 tellp()

这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).

  • seekg() 和seekp()

这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不同的原型:

输入流:seekg ( pos_type position );
输出流:seekp ( pos_type position );

使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。

seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );

使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:

ios::beg

从流开始位置计算的位移

ios::cur

从流指针当前位置开始计算的位移

ios::end

从流末尾处开始计算的位移


流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。由于这个原因,建议对以文本文件模式打开的文件总是使用seekg 和 seekp的第一种原型,而且不要对tellg 或 tellp 的返回值进行修改。

————————————————
版权声明:本文为CSDN博主「明泽.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36955294/article/details/109512186

 二进制文件所不同仅在于打开时需要加上ios::binary方式,读写常使用read(),write()函数

【问题描述】

 写一个加密程序,对文件1.txt进行加密。它从输入流中读入一个密钥,并将文件密文输出。采用下面的简单加密算法:
 1)读入密钥的key是一个字符串;
 2)明文中字符c的密文为c^key[i];(^异或运算)
 3)循环使用key中的各个字符,直至处理完全部明文。如果key为空,则不作加密
 4)解密时,用同一个key重新加密密文,就可以得到明文。
【输入形式】
从标准输入流中读入一个密钥串,使用其对当前目录下的文件1.txt进行加密。
【输出形式】
将文件密文输出到文件2.txt
【输入样例】
输入密钥为:
1234
1.txt文件内容为
test
【输出样例】
输出密文到2.txt文件中。

2.txt文件内容为

EW@@

【样例说明】
从标准输入中读入一个密钥对文件1.txt加密,并将文件密文输出到2.txt文件中。
提示:可将得到的密文文件2.txt拷贝到1.txt文件中,并用原密钥对该文件再次加密,若得到的密文文件与原始文件相同,则说明程序算法正确。
【评分标准】
如果你的程序输出正确,得20分,每个测试点4分。

#include <iostream>
#include <fstream>
using namespace std;

void encryptFile(const string& key)
{
    ifstream inputFile("1.txt");
    ofstream outputFile("2.txt");

    if (!inputFile.is_open()) 
    {
        cout << "无法打开文件1.txt" << endl;
        return;
    }

    if (!outputFile.is_open()) 
    {
        cout << "无法打开文件2.txt" << endl;
        return;
    }

    char ch;
    int keyindex = 0;
    while (inputFile.get(ch)) 
    {
        if (!key.empty()) 
        {
            ch = ch ^ key[keyindex];
            keyindex = (keyindex + 1) % key.length();
        }
        outputFile << ch;
    }

    inputFile.close();
    outputFile.close();
}

int main() {
    string key;
    cin >> key;

    encryptFile(key);


    return 0;
}

      将1000以内所有素数保存在文件中。

         

#include <iostream>
#include <fstream>
#include<iomanip>
using namespace std;

int prime(int n)
{
    bool flag = 1;
   
        for (int i = 2; i * i <= n; i++)
        {
            if (n % i == 0)
            {
                flag = 0;
                break;
            }
        }
    return flag;
}
void encryptFile()
{
   
    ofstream outputFile("prime.txt");

    if (!outputFile.is_open()) 
    {
        cout << "无法打开文件peime.txt" << endl;
        return;
    }
    int i = 2;
    int count = 0;
    for (i; i < 1000; i++)
    {
        if (prime(i))
        {
            outputFile << setw(10) << i ;
            count++;
        }
        if (count % 5 == 0)
        {
            outputFile << endl;
        }
    }

    outputFile.close();
}

int main() {
   

    encryptFile();


    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值