我需要从一个类似Stern(英语:Star)对象的tеxt文件中读取所有属性,如下所示。我需要用"leer"替换字符串"",但是也可以有一个不应用""替换的有效字符串。

即对于另一个Stern对象,也可以使用"leer"而不是"Sol"

问题:
问题是它不能用"leer"代替""。似乎它在对象中保存了"leer\\r"而不是"leer",但是我也尝试替换"leer\\r",但仍然无法正常工作。

这是应该在文本文件中读取的Stern:

0
Sol
0.000005
0.000000
0.000000
leer
1
0

这是我的operator >>读取它:
istream& operator>>(istream& is, Stern& obj)
{
    string dummy;
    is >> obj.m_ID;
    getline(is, dummy);
    getline(is, obj.m_Bez);

    if (obj.m_Bez == "leer")
        obj.m_Bez = "";

    is >> obj.m_xKoord >> obj.m_yKoord >> obj.m_zKoord;
    getline(is,dummy);
    getline(is,obj.m_Sternbild);

    if (obj.m_Sternbild == "leer")
        obj.m_Sternbild = "";

    is >> obj.m_Index >> obj.m_PrimID;

    return is;
}

Stern.h:
#ifndef STERN_H
#define STERN_H
#include <string>
#include <iostream>

using namespace std;

class Stern
{
public:
    Stern();
    // 2.a)
    //Stern(int m_ID, string m_Bez, float m_xKoord, float m_yKoord, float m_zKoord, string m_Sternbild, int m_Index, int m_PrimID);
    virtual ~Stern();

    void print() const; // 1.b)
    friend ostream& operator<<(ostream& os, const Stern& obj); // 1.b)i.
    friend istream& operator>>(istream& is, Stern& obj);


private:
    int m_ID;
    string m_Bez;
    float m_xKoord;
    float m_yKoord;
    float m_zKoord;
    string m_Sternbild;
    int m_Index;
    int m_PrimID;
};

#endif /* STERN_H */

最佳答案

问题在于,在Windows中,newline表示为CR + LF,即:"\r\n",而在Unix中,LF只是"\n"
您的 std::getline(...) command正在读取,直到"\n"中的"leer\r\n"为止,您得到的字符串将是:

"leer\r"

要解决此问题并在Unix / Windows之间转换文件,有2个工具 dos2unix unix2dos 。 Ubuntu等效项为 fromdos todos ,您将需要fromdos将Windows文本文件转换为Unix文本文件。

要测试文件是否使用CR + LFLF,可以执行以下操作:



这是在Unix & Linux StackExchange site上插入的。



它应该是:
if (obj.m_Sternbild == "leer\r")

而不转义反斜杠\,因为\r已读入字符串。

关于c++ - std::getline()将回车符\r读入字符串,如何避免这种情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45956271/

10-11 18:37