web-dev-qa-db-fra.com

Lire le fichier en c ++ jusqu'à la fin de la ligne?

Comment puis-je lire les données jusqu'à la fin de la ligne? J'ai un fichier texte "fichier.txt" avec cette

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

J'ai ce code:

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

}

dans mes fonctions (2) j'utilise les données des lignes et il faut que ce soit Int, pas char

6
user3050163

N'utilisez pas while(!file.eof()) car eof() ne sera défini qu'après la lecture de la fin du fichier. Cela n'indique pas que la prochaine lecture sera la fin du fichier. Vous pouvez utiliser while(getline(...)) à la place et combiner avec istringstream pour lire des nombres.

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

Vous devez lire Pourquoi iostream :: eof est-il dans une condition de boucle mal considéré? .

5
herohuyongtao

Quant à la lecture jusqu’au bout de la ligne. il y a std::getline .

Cependant, vous avez un autre problème: vous bouclez while (!file.eof()) qui ne fonctionnera probablement pas comme prévu. La raison en est que l'indicateur eofbit n'est défini que lorsque after vous essayez de lire au-delà de la fin du fichier. Au lieu de cela, vous devriez faire par exemple while (std::getline(...)).

2
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

Si vous voulez l'écrire en tant que fonction afin d'appeler certains où, vous pouvez utiliser un vecteur. C’est une fonction que j’utilise pour lire un tel fichier et renvoyer des éléments entiers au niveau des siens.

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