相关疑难解决方法(0)

std::getline() 将回车符 \r 读取到字符串中,如何避免这种情况?

我需要从 at\xd0\xb5xt 文件中读取一个(engl.: Star)对象的所有属性,如下所示Stern。我需要将字符串替换"leer""",但也可能存在不应替换为 的有效字符串""

\n\n

即对于另一个Stern对象也可以有"leer"代替"Sol"

\n\n

问题:
\n问题是它没有将 替换"leer""". 看起来它保存"leer\\\\r"在对象中而不是仅保存在对象"leer"中,但我也尝试替换"leer\\\\r",但它仍然不起作用。

\n\n

这是Stern应该阅读的文本文件中的一个:

\n\n
0\nSol\n0.000005\n0.000000\n0.000000\nleer\n1\n0\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的operator >>阅读内容:

\n\n
istream& operator>>(istream& is, Stern& obj)\n{\n    string dummy;\n    is >> obj.m_ID;\n    getline(is, dummy);\n    getline(is, obj.m_Bez);\n\n    if (obj.m_Bez == "leer")\n        obj.m_Bez = "";\n\n    is >> obj.m_xKoord >> obj.m_yKoord >> obj.m_zKoord;\n    getline(is,dummy);\n    getline(is,obj.m_Sternbild);\n\n    if (obj.m_Sternbild …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

8
推荐指数
1
解决办法
1万
查看次数

std :: getline处理\n,\ r和\ r \n

我正在从文本文件中读取数据,并逐行使用std::getline.默认情况下,这会读取换行符\n.我的代码依赖于此.

然而,事实证明我必须处理可能在不同环境中生成的数据,即换行符是\r(Mac),\n(Unix)或\r\n(Windows)

是否有一个简单的解决方案,以便我可以做类似的事情

std::getline(data,str,'\r\n','\r','\n');
Run Code Online (Sandbox Code Playgroud)

但得到它首先寻找\r\n,然后\r\n使之独立任何环境中生成它返回一个"行"?

或者更一般地说:std::getline对于任何类型的常用换行/回车,有没有办法用来返回"线"?

目前我所想出的就是

std::vector<int> size(3);
for (int i=0;i<3;i++){

    data.open(c_string_file_name);
    switch (i){
        case 0: std::getline(data,str,'\r\n');size[0]=str.size();break;
        case 1: std::getline(data,str,'\r');size[1]=str.size();break;
        case 2: std::getline(data,str,'\n');size[2]=str.size();break;
    }
    data.close();

}

int min=std::min_element(size.begin(),size.end());

std::string delim;

switch (min){
    case 0:delim='\r\n';break;
    case 1:delim='\r';break;
    case 2:delim='\n';break;
}
if ((size[0]==size[1])&&(min==1)){
    delim='\r\n';
}
//rest of code use

std::getline(data,str,delim.c_str());
Run Code Online (Sandbox Code Playgroud)

基于以下假设:假设存在换行符,相关定界符将产生最短的"行".还要考虑这样一个事实,即如果它是一个分隔符\r,\r\n它将具有相同的长度字符串\r\n

c++ getline istringstream

6
推荐指数
0
解决办法
1万
查看次数

在 istream 上使用 regex_iterator

我希望能够解决这样的问题:Getting std::ifstream to handle LF, CR, and CRLF? 其中 anistream需要通过复杂的分隔符进行标记;这样标记化的唯一方法istream是:

  1. istream一次读取一个字符
  2. 收集角色
  3. 当命中分隔符时,将集合作为标记返回

正则表达式非常擅长用复杂的分隔符标记字符串:

string foo{ "A\nB\rC\n\r" };
vector<string> bar;

// This puts {"A", "B", "C"} into bar
transform(sregex_iterator(foo.cbegin(), foo.cend(), regex("(.*)(?:\n\r?|\r)")), sregex_iterator(), back_inserter(bar), [](const smatch& i){ return i[1].str(); });
Run Code Online (Sandbox Code Playgroud)

但我不能regex_iterator在 a 上使用 a istream:( 我的解决方案是吸食istream然后运行regex_iterator它,但吸食步骤似乎是多余的。

是否存在istream_iterator和 的邪恶组合regex_iterator,或者如果我想要它,我必须自己编写它吗?

c++ regex iterator istream-iterator istream

5
推荐指数
1
解决办法
1776
查看次数

Getline to String复制换行符

我正在逐行读取文件并将每行添加到字符串中.但是,对于每一行,字符串长度增加1,我认为这是由于换行符所致.如何将其从复制中删除.

这是我的代码尝试做同样的事情.

if (inputFile.is_open())
{
    {
        string currentLine;
        while (!inputFile.eof())
            while( getline( inputFile, currentLine ) )
            {
                string s1=currentLine;
                cout<<s1.length();
            }
Run Code Online (Sandbox Code Playgroud)

[更新说明]我使用记事本++来确定我逐行选择的长度.所以他们显示了123,450,500,120,我的节目显示124,451,501,120.除最后一行外,所有line.length()都显示增加1的值.

c++ string file-io newline

3
推荐指数
1
解决办法
1万
查看次数

C++:使用std :: istream或sentry环绕的奇怪行为

这个小的自定义getline函数是作为一个关于处理不同行结尾的问题的答案.

该功能非常有效,直到2天前编辑,使其不会跳过每行的前导空格.但是,在编辑之后,程序现在进入无限循环.对代码进行的唯一更改是以下更改的行:

std::istream::sentry se(is);  // When this line is enabled, the program executes
                              // correctly (no infinite loop) but it does skip
                              // leading white spaces
Run Code Online (Sandbox Code Playgroud)

对此:

std::istream::sentry se(is, true); // With this line enabled, the program goes 
                                   // into infinite loop inside the while loop  
                                   // of the main function.
Run Code Online (Sandbox Code Playgroud)

如果我们指定不跳过空格,有人可以帮我解释为什么程序无限循环?

这是完整的程序......

std::istream& safeGetline(std::istream& is, std::string& t)
{
    t.clear();

    // The characters in the stream are read one-by-one using a std::streambuf.
    // That is faster than reading …
Run Code Online (Sandbox Code Playgroud)

c++ istream sentry

3
推荐指数
1
解决办法
1644
查看次数

在C++中逐行读取二进制文件

我是C++的初学者,所以我希望你能忍受我.

试图读取一个文本格式的文件,每个文件都有这样的行(前几行,称为标题行):

@HD VN:1.5  SO:queryname
Run Code Online (Sandbox Code Playgroud)

或者像这样

read.1  4   *   0   0   *   *   0   0   CAACCNNTACCACAGCCCGANGCATTAACAACTTAANNNCNNNTNNANNNNNNNNNNNNTTGAAAAAAAAAAAAAAAAAA    A<.AA##F..<F)<)FF))<#A<7<F.)FA.FAA.)###.###F##)############)FF)A<..A..7A....<F.A    XC:Z:CAACCNNTACCA   RG:Z:A  XQ:i:2
Run Code Online (Sandbox Code Playgroud)

两者都是制表符分隔.

该文件非常大,因此是二进制格式.我想知道是否可以从每行的二进制格式文件中读取,在该行上进行一些处理,然后将其写入二进制格式输出文件.

我从这段代码开始:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
  string input_file = argv[1];
  string output_file = argv[2];
  string line;
  ifstream istream;
  istream.open(input_file.c_str(),ios::binary|ios::in);
  ofstream ostream;
  ostream.open(output_file.c_str(),ios::binary|ios::out);
  while(getline(istream,line,'\n')){
    if(line.empty()) continue;
    //process line assuming it is read as a string
    ostream<<line<<endl;
  }
  istream.close();
  ostream.close();
}
Run Code Online (Sandbox Code Playgroud)

但它崩溃了:Segmentation fault (core dumped),当我试图解析部分linestring …

c++ binary getline ifstream ofstream

1
推荐指数
1
解决办法
5062
查看次数

C++中的字符串连接(Linux)

我想在C++中连接三个字符串.

我有一个std::vector<std::string> my_list存储文件名的向量.我想为每个文件名添加目录和文件扩展名,以便从文件中读取二进制信息,所以我这样做:

for (int i = 0; i < my_list.size(); i++) {
        std::string tmp = prefix + my_list[i] + suffix;
        std::ifstream file(tmp.c_str(), std::ifstream::binary);
}
Run Code Online (Sandbox Code Playgroud)

其中前缀 ist std :: string prefix ="directory /"和后缀 ist std :: string suffix =".foo".

它适用于Windows.但它在Linux中不起作用.后缀会覆盖"tmp"-string.它看起来像foo/y_file_timestamp而不是out/my_file_timestamp.foo.

我该怎么做才能防止这种覆盖?

c++ linux

0
推荐指数
1
解决办法
178
查看次数