如何使用c ++将不同长度的整个.txt文件读入数组?

时间:2012-01-18 16:09:54

标签: c++ string file-io fstream

我正在制作一个移位密码,它从文件中读取文本并对其进行解码。解密工作正常,我无法弄清楚如何找到文件的长度而不将其硬编码到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");

4 个答案:

答案 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());