1 /*
2 * cDataFile.cc
3 * Avida
4 *
5 * Called "data_file.cc" prior to 12/2/05.
6 * Copyright 1999-2011 Michigan State University. All rights reserved.
7 * Copyright 1993-2003 California Institute of Technology.
8 *
9 *
10 * This file is part of Avida.
11 *
12 * Avida is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
14 *
15 * Avida is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public License along with Avida.
19 * If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23 #include "cDataFile.h"
24
25 #include "cStringUtil.h"
26
27 #include <cstdio>
28 #include <ctime>
29
30 using namespace std;
31
32
cDataFile(cString & name)33 cDataFile::cDataFile(cString& name) : m_name(name), m_descr_written(false), m_num_cols(0)
34 {
35 m_fp.open(name);
36 assert(m_fp.good());
37 m_descr_written = false;
38 }
39
40
Write(double x,const char * descr,const char * format)41 void cDataFile::Write(double x, const char* descr, const char* format)
42 {
43 if (!m_descr_written) {
44 m_data << x << " ";
45 WriteColumnDesc(descr, format);
46 } else {
47 m_fp << x << " ";
48 }
49 }
50
51
Write(int i,const char * descr,const char * format)52 void cDataFile::Write(int i, const char* descr, const char* format)
53 {
54 if (!m_descr_written) {
55 m_data << i << " ";
56 WriteColumnDesc(descr, format);
57 } else {
58 m_fp << i << " ";
59 }
60 }
61
62
Write(long i,const char * descr,const char * format)63 void cDataFile::Write(long i, const char* descr, const char* format)
64 {
65 if (!m_descr_written) {
66 m_data << i << " ";
67 WriteColumnDesc(descr, format);
68 } else {
69 m_fp << i << " ";
70 }
71 }
72
Write(unsigned int i,const char * descr,const char * format)73 void cDataFile::Write(unsigned int i, const char* descr, const char* format)
74 {
75 if (!m_descr_written) {
76 m_data << i << " ";
77 WriteColumnDesc(descr);
78 } else {
79 m_fp << i << " ";
80 }
81 }
82
83
Write(const char * data_str,const char * descr,const char * format)84 void cDataFile::Write(const char* data_str, const char* descr, const char* format)
85 {
86 if (!m_descr_written) {
87 m_data << data_str << " ";
88 WriteColumnDesc(descr, format);
89 } else {
90 m_fp << data_str << " ";
91 }
92 }
93
Write(tArray<int> list,const char * descr,const char * format)94 void cDataFile::Write(tArray<int> list, const char* descr, const char* format)
95 {
96 //Anya is trying to make a commant to write vectors for Kaboom data
97 if (!m_descr_written) {
98 for (int i=0; i< (int)list.GetSize();i++) {
99 m_data << list[i] << " ";
100 }
101 WriteColumnDesc(descr, format);
102 } else {
103 for (int i =0; i < (int)list.GetSize(); i++) {
104 m_fp << list[i] << " ";
105 }
106 }
107 }
108
109
WriteBlockElement(double x,int element,int x_size)110 void cDataFile::WriteBlockElement(double x, int element, int x_size)
111 {
112 m_fp << x << " ";
113 if (((element + 1) % x_size) == 0) m_fp << "\n";
114 }
115
WriteBlockElement(int i,int element,int x_size)116 void cDataFile::WriteBlockElement(int i, int element, int x_size)
117 {
118 m_fp << i << " ";
119 if (((element + 1) % x_size) == 0) m_fp << "\n";
120 }
121
WriteColumnDesc(const char * descr,const char * format)122 void cDataFile::WriteColumnDesc(const char* descr, const char* format)
123 {
124 if (!m_descr_written) {
125 m_num_cols++;
126 m_descr += cStringUtil::Stringf("# %2d: %s\n", m_num_cols, descr);
127 cString formatstr(format);
128 if (formatstr != "") m_format += formatstr + " ";
129 }
130 }
131
WriteComment(const char * comment)132 void cDataFile::WriteComment(const char* comment)
133 {
134 if (!m_descr_written) m_descr += cStringUtil::Stringf("# %s\n", comment);
135 }
136
137
WriteRawComment(const char * comment)138 void cDataFile::WriteRawComment(const char* comment)
139 {
140 if (!m_descr_written) m_descr += cStringUtil::Stringf("%s\n", comment);
141 }
142
WriteRaw(const char * str)143 void cDataFile::WriteRaw(const char* str)
144 {
145 m_fp << cStringUtil::Stringf( "%s\n", str);
146 }
147
148
149
150
WriteTimeStamp()151 void cDataFile::WriteTimeStamp()
152 {
153 if (!m_descr_written) {
154 time_t time_p = time(0);
155 m_descr += cStringUtil::Stringf("# %s", ctime(&time_p));
156 }
157 }
158
FlushComments()159 void cDataFile::FlushComments()
160 {
161 if (!m_descr_written) {
162 m_fp << m_descr;
163 m_descr = "";
164
165 m_descr_written = true;
166 assert(m_data.str().size() == 0);
167 }
168 }
169
170
Endl()171 void cDataFile::Endl()
172 {
173 if (!m_descr_written) {
174 // Handle filetype and format first
175 if (m_filetype != "") m_fp << "#filetype " << m_filetype << endl;
176 if (m_format != "") m_fp << "#format " << m_format << endl;
177
178 // Output column descriptions and comments
179 m_fp << m_descr << endl;
180 m_descr = "";
181
182 // Print the first row of data
183 m_fp << m_data.str() << endl;
184 m_data.clear();
185 m_data.str("");
186
187 m_descr_written = true;
188 } else {
189 m_fp << endl;
190 }
191 }
192