web-dev-qa-db-ja.com

行末までC ++でファイルから読み取りますか?

行末までデータを読み取るにはどうすればよいですか?これを含むテキストファイル「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)
    }

}

私のfunctions(2)では、行からのデータを使用し、charではなくIntにする必要があります

7
user3050163

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 ...
        }
    }
}

ループ条件内のiostream :: eofが間違っていると考えられる理由 を読む必要があります。

6
herohuyongtao

行末まで読むことも。 _std::getline_ があります。

ただし、別の問題があります。つまり、while (!file.eof())をループすることです。これは、期待どおりに機能しない可能性があります。その理由は、eofbitフラグはafterがファイルの終わりを超えて読み取ろうとするまで設定されないためです。代わりに、たとえばwhile (std::getline(...))

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
1
Rakia

どこかで呼び出すために関数として記述したい場合は、ベクトルを使用できます。これは、そのようなファイルを読み込んで整数要素を賢く返すために使用する関数です。

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;
}
0
user7925034