2013-01-09 25 views
0

我正在讀取具有以下信息的原始網絡文件: 1. Arc ID 2.尾節點 3.頭節點使用ifstream對象讀取文件 - 二進制'>>':沒有找到需要類型爲'int *'的右側操作數的操作符

爲此,我寫了下列類型 - 弧(有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_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)。任何人都可以幫我編寫重載函數嗎?

回答

0

你不應該傳遞一個指針到的int流的提取操作,但一個參考:

INT I; cin >> i;

一些更多的注意事項:

  • 「二進制」適用於運營商,因爲它需要兩個操作數。這有沒有與原始/壓縮二進制表示形式相對,而不是文本表示。
  • C++ IOstream用於文本IO。他們也有讀/寫原始字節的方法,但是你必須自己關心格式化。這很複雜,這就是爲什麼存在各種所謂的序列化庫。我會盡量避免自己做。
  • typedef struct { ... } name;創建一個匿名結構,然後使用typedef爲其命名。這在C中很有用,然後你可以將結構稱爲name,而對於普通結構,則必須使用struct name,但不能在C++中使用。放棄這一點,這只是醜陋和不必要的。
  • 是的,您可能也可能應該爲您的結構超載插入和提取操作符。
  • 我會考慮使用std :: vector或類似的容器,而不是使用指針/大小組合來滾動我自己的容器。
相關問題