我需要从一个类似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 + LF
或LF
,可以执行以下操作:这是在Unix & Linux StackExchange site上插入的。
它应该是:
if (obj.m_Sternbild == "leer\r")
而不转义反斜杠
\
,因为\r
已读入字符串。关于c++ - std::getline()将回车符\r读入字符串,如何避免这种情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45956271/