Skip to content

Commit c7ee261

Browse files
committed
Merge pull request #3361 from BonsaiAI/avoid-snprintf
replace snprintf with a C++98 equivalent
2 parents 665649a + b72b031 commit c7ee261

File tree

7 files changed

+42
-35
lines changed

7 files changed

+42
-35
lines changed

examples/cifar10/convert_cifar_data.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "caffe/proto/caffe.pb.h"
1818
#include "caffe/util/db.hpp"
19+
#include "caffe/util/format.hpp"
1920

2021
using caffe::Datum;
2122
using boost::scoped_ptr;
@@ -52,19 +53,18 @@ void convert_dataset(const string& input_folder, const string& output_folder,
5253
for (int fileid = 0; fileid < kCIFARTrainBatches; ++fileid) {
5354
// Open files
5455
LOG(INFO) << "Training Batch " << fileid + 1;
55-
snprintf(str_buffer, kCIFARImageNBytes, "/data_batch_%d.bin", fileid + 1);
56-
std::ifstream data_file((input_folder + str_buffer).c_str(),
56+
string batchFileName = input_folder + "/data_batch_"
57+
+ caffe::format_int(fileid+1) + ".bin";
58+
std::ifstream data_file(batchFileName.c_str(),
5759
std::ios::in | std::ios::binary);
5860
CHECK(data_file) << "Unable to open train file #" << fileid + 1;
5961
for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) {
6062
read_image(&data_file, &label, str_buffer);
6163
datum.set_label(label);
6264
datum.set_data(str_buffer, kCIFARImageNBytes);
63-
int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d",
64-
fileid * kCIFARBatchSize + itemid);
6565
string out;
6666
CHECK(datum.SerializeToString(&out));
67-
txn->Put(string(str_buffer, length), out);
67+
txn->Put(caffe::format_int(fileid * kCIFARBatchSize + itemid, 5), out);
6868
}
6969
}
7070
txn->Commit();
@@ -82,10 +82,9 @@ void convert_dataset(const string& input_folder, const string& output_folder,
8282
read_image(&data_file, &label, str_buffer);
8383
datum.set_label(label);
8484
datum.set_data(str_buffer, kCIFARImageNBytes);
85-
int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid);
8685
string out;
8786
CHECK(datum.SerializeToString(&out));
88-
txn->Put(string(str_buffer, length), out);
87+
txn->Put(caffe::format_int(itemid, 5), out);
8988
}
9089
txn->Commit();
9190
test_db->Close();

examples/mnist/convert_mnist_data.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <string>
2424

2525
#include "caffe/proto/caffe.pb.h"
26+
#include "caffe/util/format.hpp"
2627

2728
#if defined(USE_LEVELDB) && defined(USE_LMDB)
2829

@@ -108,8 +109,6 @@ void convert_dataset(const char* image_filename, const char* label_filename,
108109
char label;
109110
char* pixels = new char[rows * cols];
110111
int count = 0;
111-
const int kMaxKeyLength = 10;
112-
char key_cstr[kMaxKeyLength];
113112
string value;
114113

115114
Datum datum;
@@ -123,18 +122,17 @@ void convert_dataset(const char* image_filename, const char* label_filename,
123122
label_file.read(&label, 1);
124123
datum.set_data(pixels, rows*cols);
125124
datum.set_label(label);
126-
snprintf(key_cstr, kMaxKeyLength, "%08d", item_id);
125+
string key_str = caffe::format_int(item_id, 8);
127126
datum.SerializeToString(&value);
128-
string keystr(key_cstr);
129127

130128
// Put in db
131129
if (db_backend == "leveldb") { // leveldb
132-
batch->Put(keystr, value);
130+
batch->Put(key_str, value);
133131
} else if (db_backend == "lmdb") { // lmdb
134132
mdb_data.mv_size = value.size();
135133
mdb_data.mv_data = reinterpret_cast<void*>(&value[0]);
136-
mdb_key.mv_size = keystr.size();
137-
mdb_key.mv_data = reinterpret_cast<void*>(&keystr[0]);
134+
mdb_key.mv_size = key_str.size();
135+
mdb_key.mv_data = reinterpret_cast<void*>(&key_str[0]);
138136
CHECK_EQ(mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0), MDB_SUCCESS)
139137
<< "mdb_put failed";
140138
} else {

examples/siamese/convert_mnist_siamese_data.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "stdint.h"
1414

1515
#include "caffe/proto/caffe.pb.h"
16+
#include "caffe/util/format.hpp"
1617
#include "caffe/util/math_functions.hpp"
1718

1819
#ifdef USE_LEVELDB
@@ -75,8 +76,6 @@ void convert_dataset(const char* image_filename, const char* label_filename,
7576
char label_i;
7677
char label_j;
7778
char* pixels = new char[2 * rows * cols];
78-
const int kMaxKeyLength = 10;
79-
char key[kMaxKeyLength];
8079
std::string value;
8180

8281
caffe::Datum datum;
@@ -99,8 +98,8 @@ void convert_dataset(const char* image_filename, const char* label_filename,
9998
datum.set_label(0);
10099
}
101100
datum.SerializeToString(&value);
102-
snprintf(key, kMaxKeyLength, "%08d", itemid);
103-
db->Put(leveldb::WriteOptions(), std::string(key), value);
101+
std::string key_str = caffe::format_int(itemid, 8);
102+
db->Put(leveldb::WriteOptions(), key_str, value);
104103
}
105104

106105
delete db;

include/caffe/util/format.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef CAFFE_UTIL_FORMAT_H_
2+
#define CAFFE_UTIL_FORMAT_H_
3+
4+
#include <iomanip> // NOLINT(readability/streams)
5+
#include <sstream> // NOLINT(readability/streams)
6+
#include <string>
7+
8+
namespace caffe {
9+
10+
inline std::string format_int(int n, int numberOfLeadingZeros = 0 ) {
11+
std::ostringstream s;
12+
s << std::setw(numberOfLeadingZeros) << std::setfill('0') << n;
13+
return s.str();
14+
}
15+
16+
}
17+
18+
#endif // CAFFE_UTIL_FORMAT_H_

src/caffe/solver.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <vector>
55

66
#include "caffe/solver.hpp"
7+
#include "caffe/util/format.hpp"
78
#include "caffe/util/hdf5.hpp"
89
#include "caffe/util/io.hpp"
910
#include "caffe/util/upgrade_proto.hpp"
@@ -448,11 +449,8 @@ void Solver<Dtype>::CheckSnapshotWritePermissions() {
448449

449450
template <typename Dtype>
450451
string Solver<Dtype>::SnapshotFilename(const string extension) {
451-
string filename(param_.snapshot_prefix());
452-
const int kBufferSize = 20;
453-
char iter_str_buffer[kBufferSize];
454-
snprintf(iter_str_buffer, kBufferSize, "_iter_%d", iter_);
455-
return filename + iter_str_buffer + extension;
452+
return param_.snapshot_prefix() + "_iter_" + caffe::format_int(iter_)
453+
+ extension;
456454
}
457455

458456
template <typename Dtype>

tools/convert_imageset.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "caffe/proto/caffe.pb.h"
2222
#include "caffe/util/db.hpp"
23+
#include "caffe/util/format.hpp"
2324
#include "caffe/util/io.hpp"
2425
#include "caffe/util/rng.hpp"
2526

@@ -99,8 +100,6 @@ int main(int argc, char** argv) {
99100
std::string root_folder(argv[1]);
100101
Datum datum;
101102
int count = 0;
102-
const int kMaxKeyLength = 256;
103-
char key_cstr[kMaxKeyLength];
104103
int data_size = 0;
105104
bool data_size_initialized = false;
106105

@@ -131,13 +130,12 @@ int main(int argc, char** argv) {
131130
}
132131
}
133132
// sequential
134-
int length = snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id,
135-
lines[line_id].first.c_str());
133+
string key_str = caffe::format_int(line_id, 8) + "_" + lines[line_id].first;
136134

137135
// Put in db
138136
string out;
139137
CHECK(datum.SerializeToString(&out));
140-
txn->Put(string(key_cstr, length), out);
138+
txn->Put(key_str, out);
141139

142140
if (++count % 1000 == 0) {
143141
// Commit db

tools/extract_features.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#include <stdio.h> // for snprintf
21
#include <string>
32
#include <vector>
43

@@ -10,6 +9,7 @@
109
#include "caffe/net.hpp"
1110
#include "caffe/proto/caffe.pb.h"
1211
#include "caffe/util/db.hpp"
12+
#include "caffe/util/format.hpp"
1313
#include "caffe/util/io.hpp"
1414
#include "caffe/vision_layers.hpp"
1515

@@ -135,8 +135,6 @@ int feature_extraction_pipeline(int argc, char** argv) {
135135
LOG(ERROR)<< "Extacting Features";
136136

137137
Datum datum;
138-
const int kMaxKeyStrLength = 100;
139-
char key_str[kMaxKeyStrLength];
140138
std::vector<Blob<float>*> input_vec;
141139
std::vector<int> image_indices(num_features, 0);
142140
for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) {
@@ -158,11 +156,11 @@ int feature_extraction_pipeline(int argc, char** argv) {
158156
for (int d = 0; d < dim_features; ++d) {
159157
datum.add_float_data(feature_blob_data[d]);
160158
}
161-
int length = snprintf(key_str, kMaxKeyStrLength, "%010d",
162-
image_indices[i]);
159+
string key_str = caffe::format_int(image_indices[i], 10);
160+
163161
string out;
164162
CHECK(datum.SerializeToString(&out));
165-
txns.at(i)->Put(std::string(key_str, length), out);
163+
txns.at(i)->Put(key_str, out);
166164
++image_indices[i];
167165
if (image_indices[i] % 1000 == 0) {
168166
txns.at(i)->Commit();
@@ -186,4 +184,3 @@ int feature_extraction_pipeline(int argc, char** argv) {
186184
LOG(ERROR)<< "Successfully extracted the features!";
187185
return 0;
188186
}
189-

0 commit comments

Comments
 (0)