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>不是有效的逃逸。