从c ++中读取文件直到行尾?

时间:2014-01-24 13:38:26

标签: c++ file line

我如何阅读数据直到行尾?我有一个文本文件“file.txt”与此

1 5 9 2 59 4 6
2 1 2 
3 2 30 1 55

我有这段代码:

ifstream file("file.txt",ios::in);
while(!file.eof())
{
    ....//my functions(1)
    while(?????)//Here i want to write :while (!end of file)
    {
        ...//my functions(2)
    }

}

在我的函数中(2)我使用了行中的数据,它需要是Int,而不是char

4 个答案:

答案 0 :(得分:5)

不要使用while(!file.eof())因为eof()只会在读取文件末尾后设置。它并不表示下一次读取将是文件的结尾。您可以改为使用while(getline(...))并与istringstream结合使用来读取数字。

#include <fstream>
#include <sstream>
using namespace std;

// ... ...
ifstream file("file.txt",ios::in);
if (file.good())
{
    string str;
    while(getline(file, str)) 
    {
        istringstream ss(str);
        int num;
        while(ss >> num)
        {
            // ... you now get a number ...
        }
    }
}

您需要阅读Why is iostream::eof inside a loop condition considered wrong?

答案 1 :(得分:2)

至于阅读直到行尾。有std::getline

你有另一个问题,那就是你循环while (!file.eof()),这很可能不会像你期望的那样工作。原因是在之后尝试从文件末尾读取之后才设置eofbit标志。相反,你应该做,例如while (std::getline(...))

答案 2 :(得分:1)

char eoln(fstream &stream)          // C++ code Return End of Line
{
    if (stream.eof()) return 1;     // True end of file
    long curpos;    char ch;
    curpos = stream.tellp();        // Get current position
    stream.get(ch);                 // Get next char
    stream.clear();                 // Fix bug in VC 6.0
    stream.seekp(curpos);           // Return to prev position
    if ((int)ch != 10)              // if (ch) eq 10
        return 0;                   // False not end of row (line)
    else                            // (if have spaces?)
        stream.get(ch);             // Go to next row
    return 1;                       // True end of row (line)
}                                   // End function

答案 3 :(得分:0)

如果你想把它写成函数以便调用某些地方,你可以使用向量。这是一个函数,我用它来读取这样的文件并返回整数元素。

vector<unsigned long long> Hash_file_read(){
    int frames_sec = 25;
    vector<unsigned long long> numbers;
    ifstream my_file("E:\\Sanduni_projects\\testing\\Hash_file.txt", std::ifstream::binary);
    if (my_file) {

        //ifstream file;
        string line;

        for (int i = 0; i < frames_sec; i++){
            getline(my_file, line);
            numbers.push_back(stoull(line));
        }

    }
    else{
        cout << "File can not be opened" << endl;
    }
    return numbers;
}