C++ 一种逐行读取文件的方法,但给出了一个问题

C++ 一种逐行读取文件的方法,但给出了一个问题,c++,C++,我想逐行读取文件,下面是代码: map<int,string>WordList ; //int is the key, string the returnad value int GetWordList(char* file) { WordList.clear(); char getch; int wordindex=-1; string tempstring=""; ifstream myFile(file); while (!myF

我想逐行读取文件,下面是代码:

map<int,string>WordList ; //int is the key, string the returnad value
int GetWordList(char* file)
{
    WordList.clear();
    char getch;
    int wordindex=-1;
    string tempstring="";
    ifstream myFile(file);
    while (!myFile.eof())
    {
         myFile.get(getch);
         if (getch=='\r') continue; // skipping '\r' characters
         if (getch == '\n' || myFile.eof() )
         {
               WordList[++wordindex]=tempstring;
               tempstring="";
         }else  tempstring+=getch;
    }
    return wordindex; //returns the maximum index
}
我在文件里有三行, 但当我运行程序时,它不会退出while循环,而且单词列表始终为0,

这里再次说明:

接下来,如果你总是只想读一行,为什么要让循环变得如此复杂?这是不可能的。围绕这一点构建你的循环,你应该会很好。

这里再次说明:


接下来,如果你总是只想读一行,为什么要让循环变得如此复杂?这是不可能的。围绕这一点构建循环,你应该会没事。

别忘了避开反斜杠:

GetWordList("C:\\Students.txt");

别忘了避开反斜杠:

GetWordList("C:\\Students.txt");

考虑到您使用连续整数作为索引,似乎没有什么理由使用
std::map
而不仅仅是
std::vector

类似地,用于将输入解析为行的代码似乎完成得很少,
std::getline
也不能很好地完成

最后,您对文件结尾的测试实际上并不正确。把这些放在一起,你会得到这样的结果

std::vector<std::string> lines;

std::string line;
std::ifstream myFile(filename);

while (std::getline(myFile, line))
    lines.push_back(line);
std::矢量线;
std::字符串行;
std::ifstream myFile(文件名);
while(std::getline(myFile,line))
线。推回(线);

您可能还想看看a的一些答案。

鉴于您使用连续整数作为索引,似乎没有什么理由使用
std::map
而不仅仅是
std::vector

类似地,用于将输入解析为行的代码似乎完成得很少,
std::getline
也不能很好地完成

最后,您对文件结尾的测试实际上并不正确。把这些放在一起,你会得到这样的结果

std::vector<std::string> lines;

std::string line;
std::ifstream myFile(filename);

while (std::getline(myFile, line))
    lines.push_back(line);
std::矢量线;
std::字符串行;
std::ifstream myFile(文件名);
while(std::getline(myFile,line))
线。推回(线);

您可能还想看看a的一些答案。

@Ata:单击
std::getline
上的链接,该页上有示例。@Ata:单击
std::getline
上的链接,该页上有示例。@Ata:您可能没有包含必要的标题。@Ata:您可能,使用一些可怕的古老编译器
std::getline
是在比istream::getline更近的时间添加的,但它已经存在了十多年了…@Ata:您可能没有包含必要的头。@Ata:您可能在使用某种可怕的古老编译器吗
std::getline
是比istream::getline更新添加的,但它已经存在了十多年了…-1:正确的处理方法是使用前斜杠-是的,即使在Windows上也是如此。该标准保证路径名中的前向斜杠(例如,用于fstream对象的构造函数)将被转换为平台的适当路径分隔符。@karl:什么标准保证?这里只有一个相关的标准-因此是大写字母-指定和定义语言的标准(和标准库)。我不能引用章节,但是C++ FAQ Lite支持我:@卡尔:C++标准说<代码> Basic文件FILEBUF <代码>应该“好像调用代码< FPENT/COD> >。C标准定义<代码> fOpen< <代码>:“fopen函数打开文件名指向的字符串名称的文件,并将一个流与之关联。”并且没有说明术语“文件名”是什么“实际上,C和C++是在文件系统不存在的平台上使用的,在这种情况下,没有路径,这些字符串只是一些数据库的密钥。”卡尔:你的下注也是无关紧要的,他的代码是错误的(除其他事项外)。因为
\S
不是有效的转义。在这种情况下,MSVC编译器只会忽略反斜杠。-1:正确的处理方法是使用正向斜杠-是的,即使在Windows上也是如此。标准保证在路径名中使用正向斜杠(例如,用于fstream对象的构造函数)将被转换为平台的适当路径分隔符。@karl:什么标准保证了这一点?这里只有一个相关的标准-因此大写字母-指定和定义语言(以及标准库)的标准也就是说,我不能引用一个或一个章节,但是C++ FAQ Lite支持我:@卡尔:C++标准说,<代码> Basic文件FieBuf 应该“好像调用代码< FPENT/COD> >。C标准定义<代码> fOpen< <代码>:“fopen函数打开文件名指向的字符串名称的文件,并将一个流与之关联。”并且没有说明术语“文件名”是什么“实际上,C和C++是在文件系统不存在的平台上使用的,在这种情况下,没有路径,这些字符串只是一些数据库的密钥。”卡尔:你的下投票也是不相关的,他的代码是错误的(除了其他的事情),因为<代码> < /COD>不是有效的逃逸。