C++ 文本文档中的换行符?
我编写了一个非常简单的函数,读取可能的玩家名称,并将其存储在地图中供以后使用。基本上,在文件中,每一行都是一个新的可能的玩家名称,但出于某种原因,除了姓氏之外,似乎所有的名字后面都有一些不可见的新行字符。我的打印件是这样显示的C++ 文本文档中的换行符?,c++,file-io,std,C++,File Io,Std,我编写了一个非常简单的函数,读取可能的玩家名称,并将其存储在地图中供以后使用。基本上,在文件中,每一行都是一个新的可能的玩家名称,但出于某种原因,除了姓氏之外,似乎所有的名字后面都有一些不可见的新行字符。我的打印件是这样显示的 nameLine = Georgio Name: Georgio 0 nameLine = TestPlayer Name: TestPlayer 0 这是实际的代码。我想我需要剥离一些东西,但我不确定我需要检查什么 bool PlayerManager::Par
nameLine = Georgio
Name: Georgio
0
nameLine = TestPlayer
Name: TestPlayer 0
这是实际的代码。我想我需要剥离一些东西,但我不确定我需要检查什么
bool PlayerManager::ParsePlayerNames()
{
FileHandle_t file;
file = filesystem->Open("names.txt", "r", "MOD");
if(file)
{
int size = filesystem->Size(file);
char *line = new char[size + 1];
while(!filesystem->EndOfFile(file))
{
char *nameLine = filesystem->ReadLine(line, size, file);
if(strcmp(nameLine, "") != 0)
{
Msg("nameLine = %s\n", nameLine);
g_PlayerNames.insert(std::pair<char*, int>(nameLine, 0));
}
for(std::map<char*,int>::iterator it = g_PlayerNames.begin(); it != g_PlayerNames.end(); ++it)
{
Msg("Name: %s %d\n", it->first, it->second);
}
}
return true;
}
Msg("[PlayerManager] Failed to find the Player Names File (names.txt)\n");
filesystem->Close(file);
return false;
}
boolplayermanager::ParsePlayerNames()
{
文件句柄\u t文件;
文件=文件系统->打开(“names.txt”、“r”、“MOD”);
如果(文件)
{
int size=文件系统->大小(文件);
字符*行=新字符[大小+1];
而(!filesystem->EndOfFile(文件))
{
char*nameLine=filesystem->ReadLine(行、大小、文件);
如果(strcmp(名称行“”)=0)
{
Msg(“名称行=%s\n”,名称行);
g_PlayerNames.insert(std::pair(nameLine,0));
}
for(std::map::iterator it=g_PlayerNames.begin();it!=g_PlayerNames.end();+it)
{
Msg(“名称:%s%d\n”,它->第一,它->第二);
}
}
返回true;
}
Msg(“[PlayerManager]未能找到播放器名称文件(Names.txt)\n”);
文件系统->关闭(文件);
返回false;
}
很可能ReadLine
函数也会读取换行符。我想您的文件在最后一行没有换行符,因此您不会得到该名称的换行符
但是,在我知道
文件系统
、文件句柄
和消息
是什么之前,很难确定问题出在哪里。最有可能的是ReadLine
函数也会读取换行符。我想您的文件在最后一行没有换行符,因此您不会得到该名称的换行符
但是,在我知道
文件系统
、文件句柄
和消息
是什么之前,很难确定问题可能出在哪里。ReadLine在返回的数据中清楚地包含了换行符。只需检查并移除:
char *nameLine = filesystem->ReadLine(line, size, file);
// remove any newline...
if (const char* p_nl = strchr(nameLine, '\n'))
*p_nl = '\0';
(这样做的目的是用新的NUL终止符覆盖换行符,从而有效地截断该点的ASCIIZ字符串。ReadLine在返回的数据中明确包含换行符。只需检查并删除它:
char *nameLine = filesystem->ReadLine(line, size, file);
// remove any newline...
if (const char* p_nl = strchr(nameLine, '\n'))
*p_nl = '\0';
(这是用一个新的NUL终止符来重写新行字符,它实际上截断了ASCIZ字符串。在这点上,
< p>您确实需要考虑使用IoSoots和STD::String。如果您使用C++的构造,那么上面的代码就简单得多。 代码的问题:ReadLine
如何填充line
缓冲区nameLine
指向行
缓冲区的开头,如果是这样,则在std::map
中给出,键是指针(char*
),而不是您期望的字符串,指针是相同的!如果不同的话(也就是说,你读了一行,然后移动每个名字的指针,然后std::map
将包含每个玩家的一个条目,但是你无法按玩家的名字找到条目,因为比较将是指针比较,而不是你期望的字符串比较ifstream-fin(“names.txt”);
std::字符串行;
while(fin.good())
{
std::getline(fin,line);//自动删除新行字符!
如果(!line.empty())
{
g_PlayerNames.插入(标准::对(线,0));
}
}
//现在做你需要做的
}
不需要做任何手动内存管理,而<>代码> STD::用<代码> STD::String
< p>类型,你确实需要考虑使用IoSoots和STD::String。如果你使用C++的结构,那么上面的代码就简单得多。 代码的问题:ReadLine
如何填充line
缓冲区nameLine
指向行
缓冲区的开头,如果是这样,则在std::map
中给出,键是指针(char*
),而不是您期望的字符串,指针是相同的!如果不同的话(也就是说,你读了一行,然后移动每个名字的指针,然后std::map
将包含每个玩家的一个条目,但是你无法按玩家的名字找到条目,因为比较将是指针比较,而不是你期望的字符串比较ifstream-fin(“names.txt”);
std::字符串行;
while(fin.good())
{
std::getline(fin,line);//自动删除新行字符!
如果(!line.empty())
{
g_PlayerNames.插入(标准::对(线,0));
}
}
//现在做你需要做的
}
无需进行任何手动内存管理,
std::map
是用std::string
键入的!在使用char*
作为映射键时要小心。而应该使用std::string
来表示字符串。names.txt文件的外观如何(给出上述结果)?您确定ReadLine不读取换行符吗?代码中的文件系统
是什么?使用char*
作为映射中的键时要小心。而应该使用std::string
来表示字符串。names.txt文件看起来如何(它给出了上述结果)?a