矢量返回分段故障的Fwrite和Fread 我在C++中编写了加密和解密的代码。第一个代码在vector中创建一个输出,然后使用fwrite将其写入文件,第二个代码使用fread从第一个代码读取该输出。 以下是我的代码片段:

矢量返回分段故障的Fwrite和Fread 我在C++中编写了加密和解密的代码。第一个代码在vector中创建一个输出,然后使用fwrite将其写入文件,第二个代码使用fread从第一个代码读取该输出。 以下是我的代码片段:,c++,vector,fwrite,fread,C++,Vector,Fwrite,Fread,第1代码: ..... 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 <

第1代码:

.....
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);
然后是第二个代码:

....
//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;
我非常感谢您的帮助,因为我不知道问题出在哪里,是在fwrite还是在fread。但我认为问题出在第二种情况下,当它试图读取密文(这是一个向量)时,因为如果我删除这些行,程序运行得很好,但没有解密消息

谢谢。

这是因为您编写了指向向量对象实例的指针,而不是实际的向量数据。使用

fwrite (&c[0], sizeof(vector<long long int>::value_type), c.size(), pWrite);
要从文件中读取,请执行以下操作:

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));
像这样读它:

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);

你有核心转储文件吗?如果是这样的话,gdb将帮助您避免将向量存储到这样的文件中。首先,向量包含指向其数据的指针,而该指针的地址仅在创建向量的过程中才有意义。尝试保存向量的元素。另外,请看。谢谢,我尝试了第二种解决方案,错误是“istream_操作符”不是“std”的成员,我在谷歌上搜索,并尝试了包含,但错误仍然存在。@dulipat
istream_迭代器
not
istream_操作符
:)天哪,谢谢你纠正我……)好的,我再次运行了它,解密部分有点问题。加密:加密消息的输出:104 97 104 97 104 97同时解密:解密消息的输出=-504您认为错误在解密算法中吗?或者当它试图读取文件时,向量没有正确构建?谢谢。@dulipat如果文件读取有效与否很容易检查,在将矢量写入文件之前,请按原样将其打印出来,然后在读回文件后,再执行同样的操作。如果存在差异,则文件处理存在一些问题。否则解密就有问题了。
vector::size\u type
是一种类型,而不是元素的大小,我认为这正是您想要的。正确的应该是:
fwrite(&c[0],sizeof(long-long-int),c.size(),pWrite)
std::ofstream os{"ciphertext", std::ios::out};

std::copy(std::begin(c), std::end(c),
          std::ostream_iterator<long long int>(os));
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));
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>());
std::ofstream os{"ciphertext", std::ios::out | std::ios::binary};

for (const auto& value : c)
    os.write(reinterpret_cast<const char*>(&value), sizeof(value));
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);
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));