C++: Получение неправильного размера файла

Я использую 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 для файла. По крайней мере, это, кажется, уладило его для меня. Благодаря всем, кто помог.

10
задан PSJ 17 February 2010 в 19:27
поделиться

4 ответа

На по крайней мере, для меня с 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;
}
3
ответ дан 3 December 2019 в 22:36
поделиться

Он поддерживается 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 за то, что указал на незначительный сбой опечатки...:)

9
ответ дан 3 December 2019 в 22:36
поделиться

Зачем мы используем эту разновидность 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 );
}
2
ответ дан 3 December 2019 в 22:36
поделиться

Одним из преимуществ использования отдельного файла для перечислений является возможность удаления исходного класса, использовавшего перечисление, и записи нового класса с помощью перечисления.

Если перечисление не зависит от исходного класса, то помещение его в отдельный файл упрощает будущие изменения.

-121--651626-

Я не уверен, полезно это или нет, но для Java вы можете посмотреть на ZXing . Это библиотека считывания штрих-кодов, но задача считывания QR-кодов состоит в распознавании 3-4 маркеров в штрих-коде. Вы можете найти его подход многоразовым.

-121--5085978-

Возможно ли, что ls -la фактически сообщает количество байтов, которое файл занимает на диске, вместо его фактического размера? Это объясняет, почему он немного выше.

1
ответ дан 3 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: