使用fstream的阅读每一个字符,包括空格和换行(using fstream to read ev

2019-06-26 14:44发布

我想用fstream阅读txt文件。

我使用inFile >> characterToConvert ,但问题是,这个省略任何空格和换行。

我所以我需要包括空格和换行写的加密程序。

什么是着手实现这一正确的方法是什么?

Answer 1:

也许最好的方法是阅读整个文件的内容转换为字符串,它可以非常容易地使用ifstream的公司来完成rdbuf()方法:

std::ifstream in("myfile");

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

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

然后,您可以现在你已经得到了一切,从文件中使用常规的字符串操作。

虽然托梅克问关于阅读的文本文件,同样的方法将用于读取二进制数据的工作,虽然标准::内部监督办公室::二元旗需要创建输入文件流时提供。



Answer 2:

对于加密,你就要去以二进制方式打开文件更好。 使用像这样把一个文件的字节到一个载体:

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

编辑:固定个微妙的问题按照意见。



Answer 3:

我没有测试过这一点,但我相信你需要清除“跳过空白”标志:

inFile.unsetf(ios_base::skipws);

我用C ++流以下参考: iostream库



Answer 4:

下面的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;
}

发布您的代码,我可以给你你的问题更具体的帮助...



Answer 5:

很多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(移动“得到”指针向前,然后返回当前字符),sgetc(获取当前字符,但不会移动“得到”指针)和sungetc(备份“得到”通过如果可能的一个位置)的指针。

当你不需要通过任何一个IStream类提供的插入和提取运算符的,只是需要一个基本的字节接口,通常的streambuf接口(filebuf,的StringBuf)比一个IStream接口(ifstream的,istringstream)更合适。



Answer 6:

std::ifstream ifs( "filename.txt" );

std::string str( ( std::istreambuf_iterator<char>( ifs ) ), 
                 std::istreambuf_iterator<char>()
               );


Answer 7:

你可以调用int fstream::get() ,它将从流读取一个字符。 您还可以使用istream& fstream::read(char*, streamsize) ,它执行相同的操作, get() ,只是在多个字符。 给定链接包括使用每个方法的例子。

我还建议阅读和写作二进制模式。 这使得从正确地读取和写入文件的ASCII控制字符。 否则,加密/解密操作对可能会导致不相同的文件。 要做到这一点,你打开与文件流ios::binary标志。 有了一个二进制文件,你要使用read()方法。



Answer 8:

另一种更好的方法是使用istreambuf_iterator和示例代码如下:

ifstream inputFile("test.data");

string fileData(istreambuf_iterator<char>(inputFile), istreambuf_iterator<char>());


Answer 9:

对于加密,你应该使用阅读() 。 加密算法通常处理固定大小的块。 哦,并且以二进制模式(没有翻译frmo \ n \ r为\ n)打开,传递的ios_base ::二进制作为第二个参数构造函数或open()调用。



Answer 10:

简单

#include <fstream>
#include <iomanip>


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

就这样。



Answer 11:

ifstream ifile(path);
std::string contents((std::istreambuf_iterator<char>(ifile)), std::istreambuf_iterator<char>());
ifile.close();


Answer 12:

我还发现, get()方法 ifstream的对象的方法,也可以读取文件中的所有字符,不需要取消设置std::ios_base::skipws 。 从C ++入门引用:

几个未格式化操作的处理在时间流的一个字节。 这些操作,这在表17.19中描述了读出,而忽略空格。

该动作的文章: is.get() , os.put() , is.putback() , is.unget()和is.peek() 。

下面是一个最小的工作代码

#include <iostream>
#include <fstream>
#include <string>

int main(){
    std::ifstream in_file("input.txt");

    char s;

    if (in_file.is_open()){
        int count = 0;
        while (in_file.get(s)){

            std::cout << count << ": "<< (int)s <<'\n';
            count++;
        }

    }
    else{
        std::cout << "Unable to open input.txt.\n";
    }
    in_file.close();

    return 0;
 }

输入文件(的内容cat input.txt )是

ab cd
ef gh

该程序的输出是:

0: 97
1: 98
2: 32
3: 99
4: 100
5: 10
6: 101
7: 102
8: 32
9: 103
10: 104
11: 32
12: 10

10和32是换行和空格字符的十进制表示。 显然,所有字符都被读取。



Answer 13:

正如查尔斯贝利正确地指出,你不需要fstream的的服务只是读取的字节。 所以忘记了这一点的iostream愚蠢,使用的fopen / FREAD并用它做。 C STDIO是C ++的一部分,你知道了;)



文章来源: using fstream to read every character including spaces and newline