【问题标题】:Is it OK to use iostreams with int as character-type?可以使用带有 int 作为字符类型的 iostreams 吗?
【发布时间】:2011-03-31 08:46:22
【问题描述】:

在尝试回答this question 时,我编写了这个小测试程序:

#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>

void writeFile() {
    int data[] = {0,1,2,3,4,5,6,7,8,9,1000};

    std::basic_ofstream<int> file("test.data", std::ios::binary);
    std::copy(data, data+11, std::ostreambuf_iterator<int>(file));
}

void readFile() {
    std::basic_ifstream<int> file("test.data", std::ios::binary);
    std::vector<int> data(std::istreambuf_iterator<int>(file),
        (std::istreambuf_iterator<int>()));

    std::copy(data.begin(), data.end(), 
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}


int main()
{
    writeFile();
    readFile();

    return 0;
}

按预期工作,将数据写入文件,读取文件后,正确打印:

0 1 2 3 4 5 6 7 8 9 1000

但是,我不确定是否存在任何缺陷(除了字节顺序问题,在处理二进制数据时您总是会遇到这些问题)?这允许吗?

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    它按预期工作。

    我不确定你在期待什么......

    这是否允许?

    这可能不是便携式的。 Streams 依赖于char_traits 和仅在标准中为charwchar_t 定义的方面。一个实现可以提供更多,但我敢打赌,您依赖的是这些模板的最小默认实现,而不是int 的有意识实现。更深入的使用会导致问题,我不会感到惊讶。

    【讨论】:

    • 嗯,这证实了我的怀疑。
    • 这意味着如果我真的想要它,我可以将char_traits 专门用于int
    【解决方案2】:

    在任何东西上实例化任何 iostream 类或 basic_string 但是 char 或 wchar_t,没有提供特定的自定义特征类, 是未定义的行为;我见过的大多数图书馆都将其定义为 做某事,但通常没有指定该定义,并且是 VC++ 和 g++ 之间的不同(我看过的两种情况)。如果你 定义和使用你自己的特征类,一些功能应该 工作。

    对于几乎所有格式化的插入器和提取器(&lt;&lt;&gt;&gt; 操作员),istreamostream 委托给各个方面 语言环境;如果使用其中任何一个,您必须采取措施 确保这些也能正常工作。 (这通常意味着提供一个新的 numpunct 方面。)

    即使您只使用streambuf(如您的示例),filebuf 使用 codecvt 方面。并且不需要提供实现 一个编解码器,如果有的话,它几乎可以做任何它想做的事情 它。并且由于filebuf 总是读写char 文件,这个翻译必须做点什么。我其实比较 很惊讶你的代码能正常工作,正因为如此。但你还是不 知道磁盘上的实际内容,这意味着您无法记录它, 这意味着您将来某个时候将无法阅读它。

    如果您的目标是编写二进制数据,那么您的第一步应该是 定义二进制格式,然后编写读写函数 实施它。可能使用 iostream > 语法,以及 可能使用basic_streambuf&lt;char&gt; 作为实际输入和 输出;一个basic_streambuf&lt;char&gt;,你已经仔细灌输了 “C”语言环境。或者不要定义自己的二进制格式,只需使用 现有的,例如 XDR。 (所有这一段都假设你想要 保留数据,稍后再读取。如果这些只是临时文件, 用于在单次运行期间将临时内部数据溢出到磁盘,以及 将在程序执行结束时删除,更简单的解决方案 是有效的。)

    【讨论】:

      猜你喜欢
      • 2013-12-03
      • 1970-01-01
      • 2022-06-29
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多