dul*_*pat 2 c++ vector fwrite fread
我用c ++编写了代码,用于加密和解密.第一个代码在向量中创建一个输出,然后使用fwrite将其写入文件,第二个代码使用fread从第一个代码读取输出.以下是我的代码片段:
第一个代码:
.....
string a;
vector<long long int> c;
cout << "message to be encrypted = ";
cin >> a;
cout << endl;
cout << "Encrypted message : ";
for (i=0;i<a.size();i++)
{
x=(int)a.at(i);
cout << x << " ";
c.push_back(powerMod(x,e,n));
}
for (i=0;i<c.size();i++)
{
//cout << char(c.at(i));
}
cout << endl;
//Write ciphertext c to a file
FILE * pWrite;
pWrite = fopen ("ciphertext", "w");
fwrite (&c , sizeof(c), 1, pWrite);
fclose (pWrite);
Run Code Online (Sandbox Code Playgroud)
输出是:
message to be encrypted = test
Encrypted message : 116 101 115 116
Run Code Online (Sandbox Code Playgroud)
然后第二个代码:
....
//Read Ciphertext from ciphertext
FILE * pRead2;
pRead2 = fopen ("ciphertext", "r");
fread (&c , sizeof(c), 1, pRead2);
//cout << "ciphertext is " << c << endl;
// Decryption
cout << "Decrypted message : ";
for (i=0;i<c.size();i++)
{
cout << powerMod(c.at(i),d,n) << " " ;
}
cout << endl;
Run Code Online (Sandbox Code Playgroud)
但它回归:
Segmentation Fault(Core Dumped)
Run Code Online (Sandbox Code Playgroud)
我感谢任何帮助,因为我不知道问题在哪里,在fwrite或fread中.但我认为问题是在第二次,当它试图读取密文(这是一个向量),因为如果我擦除那些行,程序运行完美,但没有解密消息.
谢谢.
这是因为您编写了一个指向矢量对象实例的指针,而不是实际的矢量数据.使用
fwrite (&c[0], sizeof(vector<long long int>::value_type), c.size(), pWrite);
Run Code Online (Sandbox Code Playgroud)
还要记住,它sizeof(c)返回向量对象实例的大小,而不是向量中的项目数.
阅读矢量时遇到类似的问题.您必须在循环中逐个执行此操作,再次将项目推送到矢量.
如果您学习使用C++ I/O流库和一些不错的标准算法并使用迭代器,那么使用C++有更简单的方法.
要将矢量写入文件:
std::ofstream os{"ciphertext", std::ios::out};
std::copy(std::begin(c), std::end(c),
std::ostream_iterator<long long int>(os));
Run Code Online (Sandbox Code Playgroud)
并从文件中读取:
std::ifstream is{"ciphertext", std::ios::in};
std::copy(std::istream_iterator<long long int>(is),
std::istream_iterator<long long int>(),
std::back_inserter(c));
Run Code Online (Sandbox Code Playgroud)
实际上有一种更简单的方法可以将文件读入矢量:
std::ifstream is{"ciphertext", std::ios::in};
std::vector<long long int> c(std::istream_iterator<long long int>(is),
std::istream_iterator<long long int>());
Run Code Online (Sandbox Code Playgroud)
这依赖于std::vector构造函数将两个迭代器作为参数.
如果您不想使用文本文件,而是使用二进制文件,那么您不得不手动循环并写入/读取数据,即您手动必须std::copy为您做什么.
像这样写这样的数据:
std::ofstream os{"ciphertext", std::ios::out | std::ios::binary};
for (const auto& value : c)
os.write(reinterpret_cast<const char*>(&value), sizeof(value));
Run Code Online (Sandbox Code Playgroud)
像这样读它:
std::ifstream is{"ciphertext", std::ios::in | std::ios::binary};
long long int value:
while (is.read(reinterpret_cast<char*>(&value), sizeof(value)))
c.push_back(value);
Run Code Online (Sandbox Code Playgroud)
如果您没有基于for C++ 11 范围的循环(在上面的编写示例中使用),请使用正常的经典迭代for循环:
std::vector<long long int>::const_iterator i;
for (i = c.begin(); i != c.end(); ++i)
os.write(reinterpret_cast<const char*>(&(*i)), sizeof(*i));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4378 次 |
| 最近记录: |