使用fstream读取每个字符,包括空格和换行符

时间:2020-03-06 14:33:33  来源:igfitidea点击:

我想使用fstream读取txt文件。

我正在使用inFile >> characterToConvert,但是问题是它忽略了任何空格和换行符。

我正在编写一个加密程序,因此需要包含空格和换行符。

完成此任务的正确方法是什么?

解决方案

以下c ++代码将读取整个文件...

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

int main () 
{
  string line;
  ifstream myfile ("foo.txt");

  if (myfile.is_open()){

    while (!myfile.eof()){
      getline (myfile,line);
      cout << line << endl;
    }
    myfile.close();
  }
  return 0;
}

发布代码,我们可以为问题提供更具体的帮助...

对于加密,最好以二进制模式打开文件。使用类似这样的方法将文件的字节放入向量中:

std::ifstream ifs("foobar.txt", std::ios::binary);

ifs.seekg(0, std::ios::end);
std::ifstream::pos_type filesize = ifs.tellg();
ifs.seekg(0, std::ios::beg);

std::vector<char> bytes(filesize);

ifs.read(&bytes[0], filesize);

编辑:根据注释修复了一个细微的错误。

我尚未对此进行测试,但是我相信我们需要清除"跳过空白"标志:

inFile.unsetf(ios_base::skipws);

我对C ++流使用以下参考:
IOstream库

对于加密,我们可能应该使用read()。加密算法通常处理固定大小的块。哦,要以二进制模式打开(不将frmo \ n \ r转换为\ n),请将ios_base :: binary作为第二个参数传递给构造函数或者open()调用。

我们可以调用int fstream :: get(),它将从流中读取单个字符。我们也可以使用istream&fstream :: read(char *,streamsize),该操作与get()相同,只是在多个字符上。给定的链接包括使用每种方法的示例。

我还建议以二进制模式进行读写。这样可以正确地从文件中读取和写入ASCII控制字符。否则,加密/解密操作对可能会导致文件不相同。为此,请使用ios :: binary标志打开文件流。对于二进制文件,我们想使用read()`方法。

最好的方法可能是将整个文件的内容读入字符串,这可以使用ifstream的rdbuf()方法很容易地完成:

std::ifstream in("myfile");

std::stringstream buffer;
buffer << in.rdbuf();

std::string contents(buffer.str());

现在,我们已经可以从文件中获取所有内容,然后就可以使用常规的字符串操作了。

当Tomek问有关读取文本文件的问题时,尽管创建输入文件流时需要提供std :: ios :: binary标志,但相同的方法也可以用于读取二进制数据。

istream层的许多好处是为流中的简单类型ro提供基本的格式设置和解析。出于我们描述的目的,所有这些都不是真正重要的,我们只是对文件作为字节流感兴趣。

为此,我们最好只使用filebuf提供的basic_streambuf接口。 "跳过空白"行为是我们不需要的istream接口功能的一部分。

filebuf是ifstream的基础,但是直接使用它是完全有效的。

std::filebuf myfile;
myfile.open( "myfile.dat", std::ios_base::in | std::ios_base::binary );

// gets next char, then moves 'get' pointer to next char in the file
int ch = myfile.sbumpc();

// get (up to) the next n chars from the stream
std::streamsize getcount = myfile.sgetn( char_array, n );

还可以看看函数snextc(向前移动'get'指针,然后返回当前char),sgetc(获取当前char但不移动'get'指针)和sungetc(备份'get'尽可能将指针指向一个位置)。

当我们不需要istream类提供的任何插入和提取运算符,而只需要基本的字节接口时,通常streambuf接口(filebuf,stringbuf)比istream接口(ifstream,istringstream)更合适。

正如Charles Bailey正确指出的那样,我们不需要fstream的服务就可以读取字节。因此,请忘记这种iostream愚蠢的做法,使用fopen / fread并完成此操作。 C stdio是C ++的一部分,你知道;)

简单的

#include <fstream>
#include <iomanip>

ifstream ifs ("file");
ifs >> noskipws

就这样。