Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[C++] Getting file size

96 views
Skip to first unread message

Alex Vinokur

unread,
Feb 7, 2005, 1:33:54 AM2/7/05
to
// ==========================================
// Getting file size
// Usage Sample Code
// Version GFS-1.0
// ---------------------------
// Alex Vinokur
// email: alex DOT vinokur AT gmail DOT com
// http://up.to/alexvn
// ==========================================


// ==================
#if (((defined unix) || (defined __unix) || (defined unix__) || (defined __unix__)) && !(defined __DJGPP__))
#define UNIX_ENV
#endif

// ------------------
#include <cassert>
#include <string>
#include <iostream>
#include <fstream>
#ifdef UNIX_ENV
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#endif
using namespace std;


#define TXT_FILE_NAME "foo.txt"
#define BIN_FILE_NAME "foo.bin"


// -----------------
size_t get_filesize_via_fseek_ftell (
const char * const filename_i,
bool txt_mode_i = true
)
{
FILE* fp = NULL;

fp = fopen(filename_i, txt_mode_i ? "r" : "rb");
assert (fp);

int rc = fseek(fp, 0, SEEK_END);
assert (rc == 0);

const size_t ret_filesize (ftell(fp));

rc = fclose(fp);
assert (rc == 0);

return ret_filesize;
}


#ifdef UNIX_ENV

// -----------------
size_t get_filesize_via_lseek (
const char * const filename_i,
bool txt_mode_i = true
)
{
int fd = 0;

fd = open(filename_i, txt_mode_i ? O_RDONLY : O_RDONLY | O_BINARY);
assert (fd != -1);

off_t rc;
rc = lseek(fd, 0, SEEK_END);
assert (rc != -1);

const size_t ret_filesize (static_cast<size_t>(rc));

rc = close(fd);
assert (rc == 0);

return ret_filesize;
}

// -----------------
size_t get_filesize_via_fstat (
const char * const filename_i,
bool txt_mode_i = true
)
{
int fd = 0;

fd = open(filename_i, txt_mode_i ? O_RDONLY : O_RDONLY | O_BINARY);
assert (fd != -1);

struct stat buf;
int rc = fstat(fd, &buf);
assert (rc == 0);

const size_t ret_filesize (static_cast<size_t>(buf.st_size));

rc = close(fd);
assert (rc == 0);

return ret_filesize;
}

// -----------------
size_t get_filesize_via_stat (
const char * const filename_i
)
{
struct stat buf;

int rc = stat (filename_i, &buf);
assert (rc == 0);

const size_t ret_filesize (static_cast<size_t>(buf.st_size));

return ret_filesize;
}

#endif


// -----------------
size_t get_filesize_via_seekg_tellg (
const char * const filename_i,
bool txt_mode_i = true
)
{
ifstream fs;

if (txt_mode_i) fs.open (filename_i);
else fs.open (filename_i, ios::binary);

assert (fs);
assert (fs.is_open());


fs.seekg(0, ios::beg);
const ios::pos_type start_pos = fs.tellg();

fs.seekg(0, ios::end);
const ios::pos_type end_pos = fs.tellg();

const size_t ret_filesize (static_cast<size_t>(end_pos - start_pos));

fs.close();
assert (!fs.is_open());

return ret_filesize;
}


// -----------------
size_t get_filesize_via_distance (
const char * const filename_i,
bool txt_mode_i = true
)
{
ifstream fs;

if (txt_mode_i) fs.open (filename_i);
else fs.open (filename_i, ios::binary);

assert (fs);
assert (fs.is_open());

const size_t ret_filesize (static_cast<size_t>(distance(
istreambuf_iterator<char>(fs),
istreambuf_iterator<char>()
)));

fs.close();
assert (!fs.is_open());

return ret_filesize;
}


// -----------------
void create_file (
const string& data_i,
const char * const filename_i,
bool txt_mode_i = true
)
{
remove (filename_i);

ofstream fs;

if (txt_mode_i) fs.open (filename_i);
else fs.open (filename_i, ios::binary);

assert (fs);
assert (fs.is_open());

fs << data_i;

fs.close();
assert (!fs.is_open());

}


int main ()
{
const char data[] = "\n";
create_file (data, TXT_FILE_NAME);
create_file (data, BIN_FILE_NAME, false);

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_fseek_ftell" << endl;

cout << "Created in TXT mode, read in TXT mode: "
<< get_filesize_via_fseek_ftell (TXT_FILE_NAME)
<< endl;

cout << "Created in BIN mode, read in BIN mode: "
<< get_filesize_via_fseek_ftell (BIN_FILE_NAME, false)
<< endl;

cout << "Created in TXT mode, read in BIN mode: "
<< get_filesize_via_fseek_ftell (TXT_FILE_NAME, false)
<< endl;

cout << "Created in BIN mode, read in TXT mode: "
<< get_filesize_via_fseek_ftell (BIN_FILE_NAME)
<< endl;


#ifdef UNIX_ENV
// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_lseek" << endl;

cout << "Created in TXT mode, read in TXT mode: "
<< get_filesize_via_lseek (TXT_FILE_NAME)
<< endl;

cout << "Created in BIN mode, read in BIN mode: "
<< get_filesize_via_lseek (BIN_FILE_NAME, false)
<< endl;

cout << "Created in TXT mode, read in BIN mode: "
<< get_filesize_via_lseek (TXT_FILE_NAME, false)
<< endl;

cout << "Created in BIN mode, read in TXT mode: "
<< get_filesize_via_lseek (BIN_FILE_NAME)
<< endl;

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_fstat" << endl;

cout << "Created in TXT mode, read in TXT mode: "
<< get_filesize_via_fstat (TXT_FILE_NAME)
<< endl;

cout << "Created in BIN mode, read in BIN mode: "
<< get_filesize_via_fstat (BIN_FILE_NAME, false)
<< endl;

cout << "Created in TXT mode, read in BIN mode: "
<< get_filesize_via_fstat (TXT_FILE_NAME, false)
<< endl;

cout << "Created in BIN mode, read in TXT mode: "
<< get_filesize_via_fstat (BIN_FILE_NAME)
<< endl;

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_stat" << endl;

cout << "Created in TXT mode : "
<< get_filesize_via_stat (TXT_FILE_NAME)
<< endl;

cout << "Created in BIN mode : "
<< get_filesize_via_stat (BIN_FILE_NAME)
<< endl;

#endif

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_seekg_tellg" << endl;

cout << "Created in TXT mode, read in TXT mode: "
<< get_filesize_via_seekg_tellg (TXT_FILE_NAME)
<< endl;

cout << "Created in BIN mode, read in BIN mode: "
<< get_filesize_via_seekg_tellg (BIN_FILE_NAME, false)
<< endl;

cout << "Created in TXT mode, read in BIN mode: "
<< get_filesize_via_seekg_tellg (TXT_FILE_NAME, false) << endl;

cout << "Created in BIN mode, read in TXT mode: "
<< get_filesize_via_seekg_tellg (BIN_FILE_NAME)
<< endl;


// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_distance" << endl;

cout << "Created in TXT mode, read in TXT mode: "
<< get_filesize_via_distance (TXT_FILE_NAME)
<< endl;

cout << "Created in BIN mode, read in BIN mode: "
<< get_filesize_via_distance (BIN_FILE_NAME, false)
<< endl;

cout << "Created in TXT mode, read in BIN mode: "
<< get_filesize_via_distance (TXT_FILE_NAME, false)
<< endl;

cout << "Created in BIN mode, read in TXT mode: "
<< get_filesize_via_distance (BIN_FILE_NAME)
<< endl;

return 0;
}


--
Alex Vinokur
email: alex DOT vinokur AT gmail DOT com
http://mathforum.org/library/view/10978.html
http://sourceforge.net/users/alexvn


Alex Vinokur

unread,
Feb 15, 2005, 2:07:39 AM2/15/05
to
// ==========================================
// Getting file size
// Usage Sample Code
// Version GFS-1.1

// ---------------------------
// Alex Vinokur
// email: alex DOT vinokur AT gmail DOT com
// http://up.to/alexvn
// ==========================================

// ==================
#if ((defined unix) || (defined __unix) || (defined unix__) || (defined __unix__))
#if (!(defined __DJGPP__))
#define UNIX_ENV
#endif
#endif

const size_t ret_filesize (ftell(fp));

return ret_filesize;

}


#ifdef UNIX_ENV

return ret_filesize;

}

return ret_filesize;

}

return ret_filesize;

}


#endif

assert (fs);
assert (fs.is_open());

fs.close();
assert (!fs.is_open());

return ret_filesize;

}

assert (fs);
assert (fs.is_open());

fs.close();
assert (!fs.is_open());

return ret_filesize;

}


// -----------------
size_t get_filesize_via_rdbuf_pubseekoff (


const char * const filename_i,
bool txt_mode_i = true
)
{
ifstream fs;

if (txt_mode_i) fs.open (filename_i);
else fs.open (filename_i, ios::binary);

assert (fs);
assert (fs.is_open());

const size_t ret_filesize (static_cast<size_t>(fs.rdbuf()->pubseekoff (0,ios::end,ios::in)));
fs.rdbuf()->pubseekpos (0,ios::in);

fs.close();
assert (!fs.is_open());

return ret_filesize;

}

ofstream fs;

assert (fs);
assert (fs.is_open());

fs << data_i;

fs.close();
assert (!fs.is_open());

}

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_fseek_ftell" << endl;

cout << "--- get_filesize_via_lseek" << endl;

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_fstat" << endl;

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_stat" << endl;

#endif

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_seekg_tellg" << endl;

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_distance" << endl;

// -------------------------------------------
cout << endl;

cout << "--- get_filesize_via_rdbuf_pubseekoff" << endl;

cout << "Created in TXT mode, read in TXT mode: "

<< get_filesize_via_rdbuf_pubseekoff (TXT_FILE_NAME)
<< endl;

cout << "Created in BIN mode, read in BIN mode: "

<< get_filesize_via_rdbuf_pubseekoff (BIN_FILE_NAME, false)
<< endl;

cout << "Created in TXT mode, read in BIN mode: "

<< get_filesize_via_rdbuf_pubseekoff (TXT_FILE_NAME, false)
<< endl;

cout << "Created in BIN mode, read in TXT mode: "

<< get_filesize_via_rdbuf_pubseekoff (BIN_FILE_NAME)

0 new messages