Я использую Linux и C++. У меня есть двоичный файл с размером 210 732 байтов, но размер, о котором сообщают с seekg/tellg, 210728.
Я получаю следующую информацию от ls-la, т.е. 210 732 байта:
- rw-rw-r - 1 pjs pjs 210732 17 февраля 10:25 output.osr
И со следующим фрагментом кода, я добираюсь 210728:
std::ifstream handle;
handle.open("output.osr", std::ios::binary | std::ios::in);
handle.seekg(0, std::ios::end);
std::cout << "file size:" << static_cast<unsigned int>(handle.tellg()) << std::endl;
Таким образом, мой код выключен на 4 байта. Я подтвердил, что размер файла корректен с Hex-редактором. Итак, почему я не получаю корректный размер?
Мой ответ: Я думаю, что проблема была вызвана при наличии, несколько открывают fstreams для файла. По крайней мере, это, кажется, уладило его для меня. Благодаря всем, кто помог.
На по крайней мере, для меня с G ++ 4.1 и 4.4 на 64-битной CentOS 5 приведенный ниже код работает так, как ожидалось, т.е. длина, которую выводит программа, такая же, как и длина, возвращаемая вызовом stat ().
#include <iostream>
#include <fstream>
using namespace std;
int main () {
int length;
ifstream is;
is.open ("test.txt", ios::binary | std::ios::in);
// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
cout << "Length: " << length << "\nThe following should be zero: "
<< is.tellg() << "\n";
return 0;
}
Он поддерживается Enumerator
с момента Ruby 1,9 (и обратно портирован на 1,8,7). См. Генератор: Ruby .
Клише пример:
fib = Enumerator.new do |y|
y.yield i = 0
y.yield j = 1
while true
k = i + j
y.yield k
i = j
j = k
end
end
100.times { puts fib.next() }
-121--3842547- Без большого опыта работы с рубином то, что C # делает в доходности
, обычно известно как ленивая оценка или ленивое выполнение : предоставление ответов только как Речь идет не о выделении памяти, а об отсрочке вычислений до фактической необходимости, выраженной способом, аналогичным простому линейному выполнению (а не базовому итератору с сохранением состояния).
Быстрый Google открыл ruby библиотеку в бета-версии. Посмотрим, чего ты хочешь.
-121--3842549-Почему вы открываете файл и проверяете его размер? Самый простой способ сделать это примерно так:
#include <sys/types.h> #include <sys/stat.h> off_t getFilesize(const char *path){ struct stat fStat; if (!stat(path, &fStat)) return fStat.st_size; else perror("file Stat failed"); }
Изменить: Спасибо PSJ за то, что указал на незначительный сбой опечатки...:)
Зачем мы используем эту разновидность Unix, если у нас есть статистика
long findSize( const char *filename )
{
struct stat statbuf;
if ( stat( filename, &statbuf ) == 0 )
{
return statbuf.st_size;
}
else
{
return 0;
}
}
, если нет,
long findSize( const char *filename )
{
long l,m;
ifstream file (filename, ios::in|ios::binary );
l = file.tellg();
file.seekg ( 0, ios::end );
m = file.tellg();
file.close();
return ( m – l );
}
Одним из преимуществ использования отдельного файла для перечислений является возможность удаления исходного класса, использовавшего перечисление, и записи нового класса с помощью перечисления.
Если перечисление не зависит от исходного класса, то помещение его в отдельный файл упрощает будущие изменения.
-121--651626-Я не уверен, полезно это или нет, но для Java вы можете посмотреть на ZXing . Это библиотека считывания штрих-кодов, но задача считывания QR-кодов состоит в распознавании 3-4 маркеров в штрих-коде. Вы можете найти его подход многоразовым.
-121--5085978-Возможно ли, что ls -la фактически сообщает количество байтов, которое файл занимает на диске, вместо его фактического размера? Это объясняет, почему он немного выше.