c++ - बाइनरी फ़ाइल से बाइट्स पढ़ना



file-io binary (1)

ऐसा लगता है कि आपकी मशीन पर हस्ताक्षर किए गए हैं । इसलिए जब आप unsigned int लिए एक नकारात्मक संख्या unsigned int , तो आपको एक बड़ा मूल्य मिलता है। आउटपुट में बड़े मूल्य नकारात्मक मान हैं, जब उन्हें char का उपयोग करते हुए दर्शाते हैं। ध्यान दें कि जब char हस्ताक्षर किए गए हैं , इसका मान -128 से 127 हो सकता है लेकिन एक बाइट 0 से 255 बीच हो सकता है इसलिए 127 से अधिक कोई भी मान श्रेणी -128 to -1 बीच नकारात्मक हो जाएगा

unsigned char प्रयोग करें:

unsigned char *s;

या यह करें:

is<< static_cast<unsigned int> (static_cast<unsigned char>(s[i]) )<<",";
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                casting to unsigned char first
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               then casting to unsigned int 

यह है, unsigned char करने के लिए पहले char डाली, फिर unsigned int करने के लिए

अच्छी तरह से यह समस्या है जो आप सामना कर रहे हैं के बारे में सब है अब शैली और मुहावरों पर कुछ नोट सी ++ में, आपको यथासंभव new उपयोग करने से बचना चाहिए। आपके मामले में, आप std::vector प्रयोग कर सकते हैं:

//define file stream object, and open the file
std::ifstream file("image.jpg",ios::binary);

//prepare iterator pairs to iterate the file content!
std::istream_iterator<unsigned char> begin(file), end;

//reading the file content using the iterator!
std::vector<unsigned char> buffer(begin,end);

अंतिम पंक्ति फ़ाइल से buffer में सभी डेटा पढ़ती है। अब आप उन्हें इन्हें प्रिंट कर सकते हैं:

std::copy(buffer.begin(), 
          buffer.end(), 
          std::ostream_iterator<unsigned int>(std::cout, ","));

इन सभी के लिए काम करने के लिए, आपको अपने कोड में पहले ही क्या जोड़ दिया गया है इसके अतिरिक्त निम्नलिखित शीर्ष लेख शामिल करने की आवश्यकता है:

#include <vector>     //for vector
#include <iterator>   //for std::istream_iterator and std::ostream_iterator
#include <algorithm>  //for std::copy

जैसा कि आप देख सकते हैं, यह मुहावरेदार समाधान सूचक और new उपयोग नहीं करता है, न ही यह कलाकारों का उपयोग करता है!

यह मेरा प्रश्न है, मैं एक .jpg फ़ाइल खोलना चाहता हूं और प्रत्येक बाइट को एक दशमलव संख्या (0-255) के रूप में एक अल्पविराम से अलग करना चाहता हूं, दूसरी .txt फ़ाइल में। अब इसे .jpf फ़ाइल को फिर से उस txt फ़ाइल का उपयोग करने में सक्षम होना चाहिए। इस तरह मैंने इसे करने की कोशिश की।

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
long x;
char *s;

ifstream ifs("image.jpg",ios::binary);
ifs.seekg(0,ios::end);
x=ifs.tellg();
ifs.seekg(0,ios::beg);

s=new char[x];
ifs.read(s,x);
ifs.close();

ofstream is("image.txt");

for(int i=0;i<x;i++){
is<<(unsigned int)s[i]<<",";
}

अब यह कार्यक्रम दशमलव की संख्या के साथ image.txt बनाता है, इस प्रकार 4294967295,4294967256,4294967295,4294967264,0,16,74,70,73,70,0,1, ...... यहाँ कुछ संख्या 4bytes लगता है लंबे, एस [i] केवल एक बाइट का उल्लेख करता है, तो कैसे (आईएनएस) एस [आई] 255 से बड़ी संख्या में लौट सकता है। कृपया कुछ इस पर मेरी मदद कर सकते हैं .... धन्यवाद।





byte