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
    将包含每个玩家的一个条目,但是你无法按玩家的名字找到条目,因为比较将是指针比较,而不是你期望的字符串比较
  • 我建议您考虑使用iostreams实现此功能,下面是一些示例代码(无需任何测试)

    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
    将包含每个玩家的一个条目,但是你无法按玩家的名字找到条目,因为比较将是指针比较,而不是你期望的字符串比较
  • 我建议您考虑使用iostreams实现此功能,下面是一些示例代码(无需任何测试)

    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