質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2059閲覧

ファイル全体のサイズ(byte)を取得する方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/01/05 10:47

編集2022/01/05 11:53

提示コードのコメント部内部のコードですがファイル全体のサイズ - ピクセルデータヘッダーファイズを算出したいのですが上手くいきません。現状はファイルの全体サイズ - ピクセルデータをすると謎の大きい値が表示されます。GetFileSize()関数でファイルの全体のサイズを取得していますがやり方が違うみたいです。 どうすればファイル全体の長さをbyteで取得出来るのでしょうか?

読み込みファイルは2024,2024 RGBA .dds です。

イメージ説明

cpp

1 2// ##################################### ファイルサイズを取得 ##################################### 3long long GetFileSize(std::string path) 4{ 5 FILE* file; 6 fopen_s(&file, path.c_str(), "r"); 7 8 if (file != NULL) 9 { 10 if (fseek(file, 0L, SEEK_END) == 0) 11 { 12 fpos_t pos; 13 14 if (fgetpos(file, &pos) == 0) 15 { 16 fclose(file); 17 return pos; 18 } 19 } 20 } 21 22 return -1; 23} 24

cpp

1 2 //画像書き込み 3 unsigned int si = loadTexture.size(); 4 fwrite(&si,sizeof(unsigned int),1,file); //テクスチャの数 5 for (int t = 0; t < loadTexture.size(); t++) 6 { 7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8// int s = GetFileSize(loadTexture.at(t)); //ファイルサイズ 9 10 glm::ivec2 size = glm::ivec2(0,0); 11 int channel = 0; 12 unsigned char* data = SOIL_load_image(loadTexture.at(t).c_str(), &size.x, &size.y, &channel, SOIL_LOAD_RGBA); 13 14 printf("size.x: %d\n", size.x); 15 printf("size.y: %d\n", size.y); 16 printf("channel: %d\n", channel); 17 18 unsigned char ch = (unsigned char)channel; 19 unsigned long long fileSize = GetFileSize(loadTexture.at(t)); 20 printf("fileSize: %llu\n",fileSize); 21 unsigned long long dataSize = size.x * size.y * channel; 22 23 printf("dataSize: %llu\n", dataSize); 24 25 fwrite(loadTexture.at(t).c_str(), sizeof(char), TEXTURE_FILE_PATH_SIZE, file); //テクスチャ名 26 fwrite(&size.x, sizeof(unsigned int), 1, file); //X 27 fwrite(&size.y, sizeof(unsigned int), 1, file); //Y 28 fwrite(&ch, sizeof(unsigned char), 1, file); //channel  29 long long sizeData = (fileSize - dataSize); 30 fwrite(&sizeData,sizeof(unsigned long),1,file); //ヘッダサイズ 31 printf("sizeData: %llu\n\n\n",sizeData); 32///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 33 FILE *ddsFile = NULL; 34 fopen_s(&ddsFile, loadTexture.at(t).c_str(), "rb"); 35 36 if ( ddsFile == NULL ) 37 { 38 std::cerr << "ファイルがありません: " << loadTexture.at(t).c_str() << std::endl; 39 assert(0); 40 } 41 else 42 { 43 while (true) 44 { 45 char line[LINE_BUFFER] = { '\0' }; 46 int res = fscanf_s(ddsFile, "%s", line, (unsigned int)LINE_BUFFER); 47 48 if (res == EOF) 49 { 50 break; 51 } 52 else 53 { 54 fwrite(line, sizeof(unsigned char), strlen(line), file); 55 } 56 } 57 } 58 59 SOIL_free_image_data(data); //解放 60 } 61

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2022/01/05 11:00

どのようにうまく行かないのですか? どういう結果を期待していて、実際はどういう結果になるのですか?
guest

回答3

0

ベストアンサー

ファイル全体のサイズ - ピクセルデータでヘッダーファイズを算出したい

DDS ファイルであればこの辺りが参考になるかと思います。

■ DDSファイルを自力で読んでみよう - SEGA TECH Blog
https://techblog.sega.jp/entry/2016/12/26/100000
■ DDS ファイルフォーマットの詳細解説 - [HYPER でんち]
https://dench.flatlib.jp/ddsformat

GetFileSize()関数でファイルの全体のサイズを取得

対象関数を試した感じだとファイルサイズは合っているかと思います。

謎の大きい値が表示されます

計算結果がマイナスなった為でしょうね・・
5592580 - 16777216 = -11184636 → 0xFFFFFFFFFF555604 → 18446744073698366980

おそらく DDS ファイルが圧縮されている為と思われます。ファイルサイズからすると DXT5 とかでしょうか。
5,592,580 bytes ≒ 5461.5 KB ≒ 5.33 MB

■ DDSファイル について まとめ
https://vfxlog.com/dds/

DDSファイルの テクスチャ容量

解像度DXT5
2048x20485.33MB

<参考>
■ DXTC(S3TC)圧縮のアルゴリズムとは?~後編~
https://www.webtech.co.jp/blog/optpix_labs/format/4569/

投稿2022/01/05 15:17

編集2022/01/05 16:58
cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

fopenで"rb"で開かないとWindowsでは若干ずれるような気もする。
それはそうと、実際のファイルサイズは5.6MBなの?
SOIL_load_imageで読む対象は生の32bppが格納されている画像ファイルなの(YUV420だったり、圧縮されていたりしない)?

投稿2022/01/05 11:42

matukeso

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/05 12:04 編集

なるほど。画像は.ddsファイルです。サイズは2024,2024 です。正確にファイルサイズを読み取るにはどすればいいのでしょうか?
matukeso

2022/01/05 13:13

ddsならヘッダーサイズは124byteなんじゃが。 例えば画像がJPEGだとしたら、「ファイルサイズ - ピクセルデータ」の計算結果に意味がないのは理解できる?
guest

0

C++

1// foo.cpp : please compile me on C++17 2 3#include <iostream> 4#include <filesystem> 5 6int main() { 7 auto size = std::filesystem::file_size("foo.cpp"); // たったこんだけ(C++17なら)。 8 std::cout << "I'm " << size << " bytes.\n"; 9}

投稿2022/01/05 11:32

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問