मुझे मिलान के चार * तरीके पसंद हैं, लेकिन std :: string के साथ।
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
string& getfile(const string& filename, string& buffer) {
ifstream in(filename.c_str(), ios_base::binary | ios_base::ate);
in.exceptions(ios_base::badbit | ios_base::failbit | ios_base::eofbit);
buffer.resize(in.tellg());
in.seekg(0, ios_base::beg);
in.read(&buffer[0], buffer.size());
return buffer;
}
int main(int argc, char* argv[]) {
if (argc != 2) {
cerr << "Usage: this_executable file_to_read\n";
return EXIT_FAILURE;
}
string buffer;
cout << getfile(argv[1], buffer).size() << "\n";
}
(के साथ या ios_base :: द्विआधारी बिना, आप नई-पंक्तियों tranlated या नहीं चाहते हैं पर निर्भर करता है। आप भी getfile बदल सिर्फ एक स्ट्रिंग वापस जाने के लिए कर सकता है, ताकि आप में एक बफर स्ट्रिंग पारित करने के लिए की जरूरत नहीं है । उसके बाद, परीक्षण संकलक प्रतिलिपि बाहर का अनुकूलन करता है, तो जब लौटने को देखने के लिए)
बहरहाल, यह थोड़ा बेहतर लग सकता है (और एक बहुत धीमी हो):।
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
string getfile(const string& filename) {
ifstream in(filename.c_str(), ios_base::binary);
in.exceptions(ios_base::badbit | ios_base::failbit | ios_base::eofbit);
return string(istreambuf_iterator<char>(in), istreambuf_iterator<char>());
}
int main(int argc, char* argv[]) {
if (argc != 2) {
cerr << "Usage: this_executable file_to_read\n";
return EXIT_FAILURE;
}
cout << getfile(argv[1]).size() << "\n";
}
यदि आप बदसूरत सामान से नफरत करते हैं, तो आप सी ++ का बेहतर उपयोग नहीं करते हैं: पी – OregonGhost
लालित्य के बारे में एक नोट, भले ही सबसे सुरुचिपूर्ण iostream समाधान अभी भी आपके लिए बदसूरत प्रतीत होता है, आप बस एक सुंदर समारोह में encapsulate कर सकते हैं ताकि यह आपकी आंखों को चोट नहीं पहुंचाए;) – OregonGhost
'बदसूरत सामान' तर्क के बारे में: 'जबकि (बदसूरत)) encapsulate_more();' –