使用fstream读取每个字符,包括空格和换行符
我想使用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
就这样。