我试图教自己编程,而我有一个早期的主题,我有困难,我的头是文件IO。
到目前为止,我知道我可以保存用逗号分隔的数据,以便以后能够成功地读取这些数据。所做的事情如下:
int x[] = {1,22,333,4444,55555};
std::ofstream FileWriter;
std::string dataName = "One through Five";
for( int i = 0; i < 5; ++i)
{
FileWriter << x[i] << ',';
}
FileWriter << dataName << std::endl;
FileWriter.close();这当然很容易,但这看起来很俗气,而且实际上有点低效。我想知道是否有更好的方法来保存数据,当我稍后去阅读时,它仍然是可分离的。
不幸的是,我所做的搜索只产生了以下结果:
std::getline( FileReader, myStringBuffer, ',');那么,我是否有可能存储不同的数据点,以便在读取时将它们区分为单独的数据点,,而无需在节省时间时使用分隔字符的?也就是说,不使用某些字符或空格分隔数据。
发布于 2013-11-14 16:11:54
基本的二进制文件io实践将做你想做的事。当读取二进制数据时,您需要知道正在读取的每个数据的大小;知道这将驱动您的许多设计决策。如果您想读取一个int,后面跟着一个字符串,您需要知道int的大小(通过调用size of (Int)很容易找到),这样您就可以从试图加载数据的二进制blob中“咬掉”int的值,然后在读取int值的数据之后,您需要知道字符串有多大。由于字符串的长度是可变的,所以您需要假设一个标准长度(讨厌!),或者先从已知的数据大小读取长度,然后将那么多字节读入字符串。因此,您的数据编写器在写出字符串之前,需要写出字符串的长度(或任何其他可变大小的数据类型),作为已知的数据大小(例如,将大小信息写入无符号int)。
要想组织用于读写的二进制数据的巧妙方法,请查看Interchange (IFF)。它是TIFF、RIFF等所基于的,是设计二进制文件blob的一个很好的方法。它基本上将数据存储为“块”,其中数据首先有一个块ID,然后是以字节为单位的块大小,然后是该块的数据。这样,读取器程序就可以检查块ID,如果它不想/不知道如何处理特定类型甚至未知类型的数据,它可以跳过块大小(以字节为单位)并读取下一个块。
发布于 2013-11-14 02:43:51
通过特定字符分隔值可以工作,取决于您的值:如果字符串不使用分隔字符,例如逗号,则可以使用逗号分隔符保存值。当没有一个被认为是有用的独立角色时,事情就变得有趣了。在这种情况下,典型的方法是将引用与适当的转义字符一起使用,例如,C和C++对特定字符串文字的用法:
"开头。"\"" )对其进行转义。"\\"。有时使用的另一种方法是将值与大小前缀组合起来。然而,使用什么取决于确切的需求。
当您使用逗号作为分隔符时,在读取格式化值时可能需要跳过逗号,例如整数:它们不会轻易地通过逗号读取,而忽略它可能是不合适的。如果它丢失了,这显然是格式错误。您可能希望在出现时使用一个机械手来增加一个逗号:
std::istream& comma(std::istream& in) {
std::istream::sentry cerberos(in);
if (in && in.peek() == ',') {
in.ignore();
}
else {
in.setstate(std::ios_base::failbit);
}
return in;
}
// ...
int i, j;
if (in >> i >> comma >> j) { ... }输入表达式应该读取两个逗号分隔的整数,如果其中一个值不是int或它们没有用逗号分隔,则失败。
发布于 2013-11-14 02:50:37
如果我正确理解您的问题,您希望知道如何以您可以再次读取的格式存储数据(大概是在另一个C++程序中)。
如果是这样的话,那么有许多方法可以做到这一点:
最常见(也是最简单)的方法是:
value1 value2 value31,2,3。1#2#3这样,您就可以像以前一样使用std::getline (例如用于CSV):
char delim = ',';
while(std::getline(input_stream, temporary_string, delim) {
//data handling goes here...
}当然,由于这是一个简单的示例(例如,您的数据被构造为一个表),您将不得不调整代码,以处理更多多方面的数据,这些数据跨越多行,通常通过以块形式读取数据并根据您的格式解析这些数据块。
复杂例子(卫星坐标):
1.1 1.2 1.3 1.4 1.5
1.6 1.7 1.8 1.9
2.0
2.0
2.1 2.2 2.3 2.4 2.5
2.1 2.4它是以空格分隔的,并具有以下格式:
https://stackoverflow.com/questions/19968447
复制相似问题