From b72b0318e2802785c17be1fe8ed1b6899961df19 Mon Sep 17 00:00:00 2001 From: Tea Date: Tue, 17 Nov 2015 17:05:56 +0800 Subject: [PATCH] replace snprintf with a C++98 equivalent --- examples/cifar10/convert_cifar_data.cpp | 13 ++++++------- examples/mnist/convert_mnist_data.cpp | 12 +++++------- .../siamese/convert_mnist_siamese_data.cpp | 7 +++---- include/caffe/util/format.hpp | 18 ++++++++++++++++++ src/caffe/solver.cpp | 8 +++----- tools/convert_imageset.cpp | 8 +++----- tools/extract_features.cpp | 11 ++++------- 7 files changed, 42 insertions(+), 35 deletions(-) create mode 100644 include/caffe/util/format.hpp diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index f4c42e4d..e1b89f42 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -16,6 +16,7 @@ #include "caffe/proto/caffe.pb.h" #include "caffe/util/db.hpp" +#include "caffe/util/format.hpp" using caffe::Datum; using boost::scoped_ptr; @@ -52,19 +53,18 @@ void convert_dataset(const string& input_folder, const string& output_folder, for (int fileid = 0; fileid < kCIFARTrainBatches; ++fileid) { // Open files LOG(INFO) << "Training Batch " << fileid + 1; - snprintf(str_buffer, kCIFARImageNBytes, "/data_batch_%d.bin", fileid + 1); - std::ifstream data_file((input_folder + str_buffer).c_str(), + string batchFileName = input_folder + "/data_batch_" + + caffe::format_int(fileid+1) + ".bin"; + std::ifstream data_file(batchFileName.c_str(), std::ios::in | std::ios::binary); CHECK(data_file) << "Unable to open train file #" << fileid + 1; for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) { read_image(&data_file, &label, str_buffer); datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); - int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", - fileid * kCIFARBatchSize + itemid); string out; CHECK(datum.SerializeToString(&out)); - txn->Put(string(str_buffer, length), out); + txn->Put(caffe::format_int(fileid * kCIFARBatchSize + itemid, 5), out); } } txn->Commit(); @@ -82,10 +82,9 @@ void convert_dataset(const string& input_folder, const string& output_folder, read_image(&data_file, &label, str_buffer); datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); - int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); string out; CHECK(datum.SerializeToString(&out)); - txn->Put(string(str_buffer, length), out); + txn->Put(caffe::format_int(itemid, 5), out); } txn->Commit(); test_db->Close(); diff --git a/examples/mnist/convert_mnist_data.cpp b/examples/mnist/convert_mnist_data.cpp index 8f29bafd..16d28093 100644 --- a/examples/mnist/convert_mnist_data.cpp +++ b/examples/mnist/convert_mnist_data.cpp @@ -23,6 +23,7 @@ #include #include "caffe/proto/caffe.pb.h" +#include "caffe/util/format.hpp" #if defined(USE_LEVELDB) && defined(USE_LMDB) @@ -108,8 +109,6 @@ void convert_dataset(const char* image_filename, const char* label_filename, char label; char* pixels = new char[rows * cols]; int count = 0; - const int kMaxKeyLength = 10; - char key_cstr[kMaxKeyLength]; string value; Datum datum; @@ -123,18 +122,17 @@ void convert_dataset(const char* image_filename, const char* label_filename, label_file.read(&label, 1); datum.set_data(pixels, rows*cols); datum.set_label(label); - snprintf(key_cstr, kMaxKeyLength, "%08d", item_id); + string key_str = caffe::format_int(item_id, 8); datum.SerializeToString(&value); - string keystr(key_cstr); // Put in db if (db_backend == "leveldb") { // leveldb - batch->Put(keystr, value); + batch->Put(key_str, value); } else if (db_backend == "lmdb") { // lmdb mdb_data.mv_size = value.size(); mdb_data.mv_data = reinterpret_cast(&value[0]); - mdb_key.mv_size = keystr.size(); - mdb_key.mv_data = reinterpret_cast(&keystr[0]); + mdb_key.mv_size = key_str.size(); + mdb_key.mv_data = reinterpret_cast(&key_str[0]); CHECK_EQ(mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0), MDB_SUCCESS) << "mdb_put failed"; } else { diff --git a/examples/siamese/convert_mnist_siamese_data.cpp b/examples/siamese/convert_mnist_siamese_data.cpp index ad08036f..928b3fbf 100644 --- a/examples/siamese/convert_mnist_siamese_data.cpp +++ b/examples/siamese/convert_mnist_siamese_data.cpp @@ -13,6 +13,7 @@ #include "stdint.h" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/format.hpp" #include "caffe/util/math_functions.hpp" #ifdef USE_LEVELDB @@ -75,8 +76,6 @@ void convert_dataset(const char* image_filename, const char* label_filename, char label_i; char label_j; char* pixels = new char[2 * rows * cols]; - const int kMaxKeyLength = 10; - char key[kMaxKeyLength]; std::string value; caffe::Datum datum; @@ -99,8 +98,8 @@ void convert_dataset(const char* image_filename, const char* label_filename, datum.set_label(0); } datum.SerializeToString(&value); - snprintf(key, kMaxKeyLength, "%08d", itemid); - db->Put(leveldb::WriteOptions(), std::string(key), value); + std::string key_str = caffe::format_int(itemid, 8); + db->Put(leveldb::WriteOptions(), key_str, value); } delete db; diff --git a/include/caffe/util/format.hpp b/include/caffe/util/format.hpp new file mode 100644 index 00000000..925ad2e0 --- /dev/null +++ b/include/caffe/util/format.hpp @@ -0,0 +1,18 @@ +#ifndef CAFFE_UTIL_FORMAT_H_ +#define CAFFE_UTIL_FORMAT_H_ + +#include // NOLINT(readability/streams) +#include // NOLINT(readability/streams) +#include + +namespace caffe { + +inline std::string format_int(int n, int numberOfLeadingZeros = 0 ) { + std::ostringstream s; + s << std::setw(numberOfLeadingZeros) << std::setfill('0') << n; + return s.str(); +} + +} + +#endif // CAFFE_UTIL_FORMAT_H_ diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index d3bc7361..95d75066 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -4,6 +4,7 @@ #include #include "caffe/solver.hpp" +#include "caffe/util/format.hpp" #include "caffe/util/hdf5.hpp" #include "caffe/util/io.hpp" #include "caffe/util/upgrade_proto.hpp" @@ -448,11 +449,8 @@ void Solver::CheckSnapshotWritePermissions() { template string Solver::SnapshotFilename(const string extension) { - string filename(param_.snapshot_prefix()); - const int kBufferSize = 20; - char iter_str_buffer[kBufferSize]; - snprintf(iter_str_buffer, kBufferSize, "_iter_%d", iter_); - return filename + iter_str_buffer + extension; + return param_.snapshot_prefix() + "_iter_" + caffe::format_int(iter_) + + extension; } template diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index e51a2631..9c52bfa0 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -20,6 +20,7 @@ #include "caffe/proto/caffe.pb.h" #include "caffe/util/db.hpp" +#include "caffe/util/format.hpp" #include "caffe/util/io.hpp" #include "caffe/util/rng.hpp" @@ -99,8 +100,6 @@ int main(int argc, char** argv) { std::string root_folder(argv[1]); Datum datum; int count = 0; - const int kMaxKeyLength = 256; - char key_cstr[kMaxKeyLength]; int data_size = 0; bool data_size_initialized = false; @@ -131,13 +130,12 @@ int main(int argc, char** argv) { } } // sequential - int length = snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, - lines[line_id].first.c_str()); + string key_str = caffe::format_int(line_id, 8) + "_" + lines[line_id].first; // Put in db string out; CHECK(datum.SerializeToString(&out)); - txn->Put(string(key_cstr, length), out); + txn->Put(key_str, out); if (++count % 1000 == 0) { // Commit db diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 084c9bf8..b94dbb98 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -1,4 +1,3 @@ -#include // for snprintf #include #include @@ -10,6 +9,7 @@ #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/db.hpp" +#include "caffe/util/format.hpp" #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" @@ -135,8 +135,6 @@ int feature_extraction_pipeline(int argc, char** argv) { LOG(ERROR)<< "Extacting Features"; Datum datum; - const int kMaxKeyStrLength = 100; - char key_str[kMaxKeyStrLength]; std::vector*> input_vec; std::vector image_indices(num_features, 0); for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) { @@ -158,11 +156,11 @@ int feature_extraction_pipeline(int argc, char** argv) { for (int d = 0; d < dim_features; ++d) { datum.add_float_data(feature_blob_data[d]); } - int length = snprintf(key_str, kMaxKeyStrLength, "%010d", - image_indices[i]); + string key_str = caffe::format_int(image_indices[i], 10); + string out; CHECK(datum.SerializeToString(&out)); - txns.at(i)->Put(std::string(key_str, length), out); + txns.at(i)->Put(key_str, out); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { txns.at(i)->Commit(); @@ -186,4 +184,3 @@ int feature_extraction_pipeline(int argc, char** argv) { LOG(ERROR)<< "Successfully extracted the features!"; return 0; } -