C++ C++;:从文件读取时,getline()函数不包括最后一个字符/字符串

C++ C++;:从文件读取时,getline()函数不包括最后一个字符/字符串,c++,file,delimiter,getline,istream,C++,File,Delimiter,Getline,Istream,我有一个文本文件中的这些单词,每个单词之间用“\t”分隔 我希望能够将这些单词打印在单独的行中 例如: 以下是文本文件中的文字: hel lo im carlos 我想要的结果是: hel lo im carlos 我得到的结果是: hel lo im 代码如下: string ReadString(ifstream &file){ char buf[1024]; file.getline(&(buf[0]), 1024, '\t');

我有一个文本文件中的这些单词,每个单词之间用“\t”分隔

我希望能够将这些单词打印在单独的行中

例如: 以下是文本文件中的文字:

hel lo    im    carlos 
我想要的结果是:

hel lo  
im
carlos
我得到的结果是:

hel lo 
im
代码如下:

string ReadString(ifstream &file){
    char buf[1024];
    file.getline(&(buf[0]), 1024, '\t');
    return string(buf);
}

main(){
    ifstream delimfile("new.txt");
    while(1){
        string words = ReadString(delimfile);
        if(delimfile.eof()==true)
            break;
        cout << words << endl;
    }
    delimfile.close();
}
string ReadString(ifstream&file){
char-buf[1024];
getline(&(buf[0]),1024,“\t”);
返回字符串(buf);
}
main(){
ifstream delimfile(“new.txt”);
而(1){
stringwords=ReadString(delimfile);
if(delimfile.eof()==true)
打破
试试这个:

while(1)
{
        string words = ReadString(delimfile);
        cout << words << endl;
        if(delimfile.eof()==true)
            break;
        //cout << words << endl;
}
while(1)
{
stringwords=ReadString(delimfile);
试试这个:

while(1)
{
        string words = ReadString(delimfile);
        cout << words << endl;
        if(delimfile.eof()==true)
            break;
        //cout << words << endl;
}
while(1)
{
stringwords=ReadString(delimfile);

cout您最后一次读取将一直读取到文件末尾(因为没有
\t
让它命中)并设置EOF位。然后您测试是否设置了EOF位并中断循环。将您的条件更改为检查
delimfile.fail()
将解决此问题(因为
fail
是在读取实际失败时设置的)

您也可以将单词的输出移到条件之上,但这假定从文件中读取是有效的,这是编写代码的一种不好的方式。类似地,在文件末尾有一个额外的选项卡可以使代码正常工作,但只能使其安全地避免此问题

然而,如果我要自己写这篇文章,我会这样写:

while (std::getline(file, words, '\t')) {
  cout << words << endl;
}
while(std::getline(文件,单词,'\t')){
cout您最后一次读取将一直读取到文件末尾(因为没有
\t
让它命中)并设置EOF位。然后您测试是否设置了EOF位并中断循环。将您的条件更改为检查
delimfile.fail()
将解决此问题(因为
fail
是在读取实际失败时设置的)

您也可以将单词的输出移到条件之上,但这假定从文件中读取是有效的,这是编写代码的一种不好的方式。类似地,在文件末尾有一个额外的选项卡可以使代码正常工作,但只能使其安全地避免此问题

然而,如果我要自己写这篇文章,我会这样写:

while (std::getline(file, words, '\t')) {
  cout << words << endl;
}
while(std::getline(文件,单词,'\t')){
如果你在最后一个单词后面加个标签,那就行了。如果你在最后一个单词后面加个标签,那就行了。