Четырехзначные числа, хранящиеся в файле, записываются в ASCII и разделяются «пробелом», как их читать как целые числа. Файл примера: 53545153 49575150 56485654 53565257 52555756 51534850 56575356 56505055
Они выглядят как 8-значные числа.
Чтобы прочитать разделенный пробелами номер из файла, просто используйте operator>>
из файлапоток в целое число.
int value;
if (stream >> value) {
// Successfully read a number.
}
Если вы хотите прочитать все значения из файла. Вы можете использовать цикл:
int value;
while (stream >> value) {
// Enter the body of the loop each time a number is read.
}
Примечание. Использование eof () является плохой практикой:
while (!infile.eof()) {
// If you enter here the file may be open and readable
// BUT there may be no data left in the file and thus the next
// attempt to read will fail if there is no data.
//
// This happens because the last successful read will read up-to
// but not past the EOF. So you have read all the data but not read
// past the EOF so eof() will return false.
}
Дополнительная информация
Итак, как мы читаем 2цифры из групп из восьмизначных больших чисел, разделенных пробелами.
Что ж, мы хотим, чтобы это работало как стандартное чтение потока, поэтому мы все еще хотим использовать operator>>
для чтения из потока. Но ни один из встроенных типов не читает двухзначные числа. Поэтому нам нужно определить наш собственный класс, который будет читать двузначное число.
struct TwoDigit
{
int value; // store the result here
operator int() {return value;} // Convert TwoDigit to integer
};
std::ostream& operator<<(std::ostream& str, TwoDigit const& data) {
str << data.value; // You can do something more complicated
// for printing but its not the current question
// so I am just going to dump the value out.
}
std::istream& operator>>(std::istream& str, TwoDigit& data) {
char c1 = 'X';
char c2 = 'Y';
if (str >> c1 >> c2) {
// successfully read two characters from the stream.
// Note >> automatically drops white space (space return etc)
// so we don't need to worry about that.
if (('0' <= c1 && c1 <= '9') && ('0' <= c2 && c2 <= '9')) {
// We have all good data.
// So let us update the vale.
data.value = ((c1 - '0') * 10) + (c2 - '0');
}
else {
// We have bad data read from the stream.
// So lets mark the stream as bad;
str.clear(std::ios::failbit);
}
}
return str;
}
Теперь в вашем коде вы можете просто прочитать
TwoDigit data;
if (stream >> data) {
// Read a single two digit value correctly.
}
// or for a loop:
while(stream >> data) {
// Keep reading data from the stream.
// Each read will consume two digits.
}
// or if you want to fill a vector from a stream.
std::vector<TwoDigit> data(std::istream_iterator<TwoDigit>(stream),
std::istream_iterator<TwoDigit>());
// You can even create a vector of int just as easily.
// Because the TwoDigit has an `operator int()` to convert to int.
std::vector<int> data(std::istream_iterator<TwoDigit>(stream),
std::istream_iterator<TwoDigit>());