我正在制作一个移位密码,它从文件中读取文本并对其进行解码。解密工作正常,我无法弄清楚如何找到文件的长度而不将其硬编码到char数组的大小。它也只读取一行,任何带有旧行的腐败行为。
任何帮助都会非常感激,我已经省略了主要代码块,因为它在读入后处理数组并且看起来有点长且无关紧要。
string fileName;
cout << "Please enter the locations of your encrypted text (e.g ""encryptedText.txt""): ";
getline( cin, fileName );
char encryptedMessage[446]; //How do i read in the file length and declare the array size as a variable instead of [446]?
char decryptedMessage[446];
ifstream in(fileName);
if(in.get(encryptedMessage, 446))
{
[my decrypting code]
}
else
{
cout << "Couldn't successfully read file.\n";
}
system("pause");
答案 0 :(得分:4)
好吧,一个简单的单行程序,用于将整个文件读入动态大小的数组(不使用静态大小的数组)的字符:
#include <vector>
#include <iterator>
std::vector<char> encryptedMessage(std::istreambuf_iterator<char>(in),
std::istreambuf_iterator<char>());
不要让自己陷入动态分配,只需让std::vector
完成它的工作。由于其优化的增长行为,您不需要费心检查文件大小。在必要时或至少在文件大于几百个字符之前优化速度。当然,istreambuf_iterator
(而不是istream_iterator
)不会处理任何特殊的空格,它只是逐个从文件中获取每个字符。
您可以使用std::string
而不是std::vector<char>
执行相同操作,但我不确定其增长行为(可能它总是使用一个元素重新分配数组)。但话说回来,当文件包含400个字符时,谁在乎速度?
答案 1 :(得分:2)
您可以使用seekg来获取整个文件的大小:
#include <iostream>
#include <fstream>
using namespace std;
int main () {
long begin_byte, end_byte;
ifstream in("example.txt");
begin_byte = in.tellg();
in.seekg (0, ios::end);
end_byte = in.tellg();
int total_bytes = end_byte - begin_byte;
in.seekg(0, ios::begin);
char *message = new char[total_bytes + 1];
int index = 0;
while (in) {
message[index++] = in.get();
}
in.close();
cout << "message is: " << message << endl;
delete [] message;
return 0;
}
您可以在c ++中全面了解有关seekg,tellg和文件的更多信息here。
然而,使用char *的更好的解决方案是使用std:string并在其中未调用时调用push_back:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
ifstream in("example.txt");
string message;
while (in) {
message.push_back(in.get());
}
in.close();
cout << "message is: " << message << endl;
return 0;
}
答案 2 :(得分:1)
你不能在C ++中拥有可变长度数组(VLA) 编译器确实提供VLA作为扩展,但使用它们会使您的代码不可移植。
最简单和最佳解决方案是使用 std::string 而不是字符数组。
您可能会获得有关使用动态分配数组的建议的答案,但使用std::string
是最佳选择,因此请忽略这些。
修改强>
因为有人对此事进行了贬低。我非常有兴趣知道这些原因(只要他们是技术性的)。
答案 3 :(得分:0)
您需要动态分配的内存,管理它的最佳方式是使用std::vector
。
std::vector<char> encryptedMessage;
encryptedMessage.resize(size_of_file);
in.get(&encryptedMessage[0], encryptedMessage.size());