提示コードのコメント部内部のコードですがファイル全体のサイズ - ピクセルデータ
でヘッダーファイズを算出
したいのですが上手くいきません。現状はファイルの全体サイズ - ピクセルデータ
をすると謎の大きい値が表示されます。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
どのようにうまく行かないのですか? どういう結果を期待していて、実際はどういう結果になるのですか?
回答3件
あなたの回答
tips
プレビュー