0

我正在读取包含以下信息的原始网络文件: 1. Arc ID 2. 尾节点 3. 头节点

为此,我写出了以下类型 - 弧(具有项目 1,2 和 3)和网络(具有弧元素以及总节点和总弧的详细信息)。这是定义:

typedef struct {
    int arcno;
    int tail;
    int head;
} arc_data;

typedef struct {
    arc_data *arcs;
    int numNodes;
    int numArcs;
}  network_data;

现在在代码中我声明了ifstream目标文件并且我正在读取数据。这里 network 是network_data上面声明的类型的对象。我将弧声明为指针,因为在读取文件之前我不确定弧的总数是多少 - 因此需要动态更改弧的大小。

for(i = 1; i <= network.numArcs; i++) {
    file >> &network.arcs[i].arcno;
    file >> &network.arcs[i].tail;

但是,现在代码没有构建。我正在使用 Visual Studio 2012。编译器显示以下错误:

Error   1   error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'int *' (or there is no acceptable conversion) 
51 file >> &network.arcs[i].head;

这里有什么问题?ifstream除了读取文件还有其他方法吗?

编辑:查看 msdn 库表明重载>>运算符可以解决问题。(参考:http://msdn.microsoft.com/en-us/library/h1925w4w%28v=vs.110%29.aspx)。任何人都可以帮我编写重载函数吗?

4

1 回答 1

0

您不应该将指向 int 的指针传递给流的提取运算符,而是传递一个引用:

诠释我; 辛 >> 我;

还有一些注意事项:

  • “二进制”适用于运算符,因为它需要两个操作数。这与原始/打包二进制表示无关,而不是文本表示。
  • C++ IOstreams 是为文本 IO 制作的。他们也有读取/写入原始字节的方法,但是你必须自己处理格式。这很复杂,这就是为什么存在各种所谓的序列化库的原因。我会尽量避免自己做。
  • typedef struct { ... } name;创建一个匿名结构,然后使用 typedef 为其命名。这曾经在 C 中很有用,在那里您可以将结构称为namewhile 与您必须使用的普通结构struct name,但在 C++ 中则不行。放弃它,它只是丑陋和不必要的。
  • 是的,您可以并且可能应该为您的结构重载插入和提取运算符。
  • 我会考虑使用 std::vector 或类似的容器,而不是使用指针/大小组合滚动我自己的容器。
于 2013-01-12T23:19:49.083 回答