C ++:ifstream :: getline问题

时间:2011-01-16 06:04:54

标签: c++ file-io input ifstream istream

我正在阅读这样的文件:

char string[256];

std::ifstream file( "file.txt" ); // open the level file.

if ( ! file ) // check if the file loaded fine.
{
    // error
}

while ( file.getline( string, 256, ' ' )  )
{
    // handle input
}

仅出于测试目的,我的文件只是一行,最后有一个空格:

12345 

我的代码首先成功读取了12345。但是接着不是循环结束,它会读取另一个字符串,它似乎是一个返回/换行符。

我已将文件保存在geditnano中。我也用Linux cat命令输出它,最后没有返回。所以文件应该没问题。

为什么我的代码会读取返回/换行符?

感谢。

4 个答案:

答案 0 :(得分:3)

首先确保您的输入文件正常:

运行以下命令,让我们知道输出:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ifstream file("file.txt");
    std::cout << std::hex;

    std::copy(std::istreambuf_iterator<char>(file),
              std::istreambuf_iterator<char>(),

              std::ostream_iterator<int>(std::cout, " ")); 
}

编辑:

输出为31 32 33 34 35 20 0A

尝试运行此代码并查看输出结果:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ofstream file("file.txt");
    file << "12345 \n";
}

转储此文件的输出并将其与原始文件进行比较 问题是不同的平台具有不同的线路终端序列。我只想验证'0x0A'是您平台的线路终止序列。请注意,在文本模式下读取文件时,行终止序列将转换为'\ n',当您在文本模式下将'\ n'输出到文件时,它将转换为行终止序列。

编辑2

所以我有文件:file.txt

> od -ta -tx1 file.txt
0000000    1   2   3   4   5  sp  nl                                    
           31  32  33  34  35  20  0a                                    
0000007

因此该文件包含以0x0A

结尾的1行

使用此程序:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ifstream   file("file.txt");

    std::string line;
    while(std::getline(file,line))
    {
        std::cout << "Line(" << line << ")\n";
    }
}

我明白了:

> g++ t.cpp
> ./a.out
Line(12345 )

答案 1 :(得分:2)

它正在运作......

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

ifstream file("file.txt");

int main()
{
   string tmp="",st="";

   while (!file.eof())
    {
      file>>tmp;  
      if (tmp != "") st+=tmp;
      tmp="";  
    }
   cout<<st<<endl; 

   return 0;
}

输入file.txt:1 2 3 4 5
回答:12345

答案 2 :(得分:0)

尝试这种方式:

while ( !file.eof()  )
{
    file.getline( string, 256, ' ' );
        // handle input
}

答案 3 :(得分:0)

它很旧,但是似乎没有合适的分辨率。

令我惊讶的是,没有人注意到他正在使用空格分隔符。因此,整行将不会被读取,而只会被读取到第一行。因此,在遇到EOF之前,getline仍然需要读取更多数据。

因此,下一条getline将读取换行符,并返回与定界符相同的结果。如果getline调用是这样的:

file.getline(string,256)

它不会返回换行符,将一步完成。