2016-08-12 93 views
-5

我正在模板上做家庭作業,並從文件中讀取數據。 我有一個名爲'Cfile'的模板類和'Student'類。我會在這裏把相關的代碼,然後詢問有關該錯誤:C++:無法從'std :: ifstream'轉換爲'char *'

#include<iostream> 
#include<fstream> 
using namespace std; 

template <class T> 
class Cfile 
{ 
    ifstream fileIn; 

...jump down a bit 

T read() 
{ 

    return T(this->fileIn); //the error is in this line 

} 

而我得到的錯誤:cannot convert from 'std::ifstream' to 'char*'返回行。

Student類當然有C'tor是得到一個ifstream& in並創建一個新的學生:

Student::Student(ifstream & in) 
{ 
in.read((char*)&age, sizeof(age)); 
} 

編輯:我想我明白現在是錯誤的。 我有一個名爲「MyString的」另一個類,它具有以下讀法:

char* read(ifstream& in); 

所以也許我不小心覆蓋read方法?但是返回類型是不同的,所以它不應該發生。

EDIT#2: 的main.cpp -

#include"Cfile.h" 
#include"Student.h" 
#include"Queue.h" 
#include "C.h" 

int main() 
{ 
    ifstream i; 
    i.open("strings.txt"); 

    Cfile<Student>stuFile("strings.txt"); 

    Student a, b, c; 
    a.age = 10; 
    b.age = 20; 
    c.age = 30; 
    stuFile.write(a); 
    stuFile.write(b); 
    stuFile.write(c); 


    Student d = Student(i); 
    Student e = Student(i); 
    Student f = Student(i); 



    Cfile<char*> st; 
    Queue<char*> st1; 
    for (int i = 0;i < 10;i++) 
    { 
     st.read(st1.arr, 10); 
    } 
    i.close(); 

    return 0; 
} 

MyString.cpp -

#include "MyString.h" 



MyString::MyString() 
{ 
} 

MyString::MyString(char * st) 
{ 
    this->st = st; 
} 

char * MyString::read(ifstream& in) 
{ 

    in.read(this->st, sizeof(st)); 
    return st; 
} 

const char * MyString::getStr() 
{ 

    return this->st; 
} 


MyString::~MyString() 
{ 
} 

Student.cpp -

#include "Student.h" 



/*bool Student::operator==(Student student) 
{ 
    return this->name == student.name && 
     this->lastName == student.lastName && 
     this->age == student.age; 
}*/ 

Student::Student() 
{ 
} 

Student Student::read(ifstream& in) 
{ 
    in.read((char*)&age, sizeof(age)); 

    return *this; 
} 

void Student::write(ofstream & out) 
{ 
    out.write((char*)&age, sizeof(age)); 
} 

Student::Student(ifstream & in) 
{ 
    in.read((char*)&age, sizeof(age)); 
} 

Student::Student(Student &s) 
{ 

    this->age = s.age; 
} 

Student::Student(int age) 
{ 
    //Student s = new Student; 
    this->age = age; 
} 


Student::~Student() 
{ 
} 

Cfile.h -

#pragma once 
#include<iostream> 
#include<fstream> 
using namespace std; 

template <class T> 
class Cfile 
{ 
    ifstream fileIn; 
    ofstream fileOut; 
public: 

    Cfile() {}; 
    Cfile(char* _fileName) { 
     fileIn.open(_fileName, ios::binary); 
     fileOut.open(_fileName, ios::binary); 
    } 
    int read(T **apBuf, int aNum) 
     { 
      int count=0; 
      apBuf = new T*[aNum]; 
      for (int i = 0;i < aNum;i++) 
      { 

       *apBuf[i] = this->read(); 
       count++; 

      } 
      return count; 


    } 
    void write(T &t) 
    { 
     t.write(this->fileOut); 
    } 

    void write(T* apBuf, int aNum) { 
     for (int i = 0;i < aNum;i++) 
     { 
      write(apBuf[i]); 
     } 
    } 
    int size() 
    { 
     fileIn.seekg(0, ios::end); 
     return (fileIn.tellg()/sizeof(T)); 

    } 
    T read() 
    { 

     return T(this->fileIn); 

    } 
    ~Cfile() {}; 
}; 
+1

你能提供一個最小的,完整的例子嗎?你發佈的內容不完整。 –

+1

哪一行是錯誤?你也可以發佈該行嗎? – Matthias

+0

我編輯它,如果你需要更多的代碼請求它,而不是downvoting。 – ntrch

回答

3

考慮到問題的質量,我會盡力回答。

Cfile<char*> st; 
    Queue<char*> st1; 
    for (int i = 0;i < 10;i++) 
    { 
     st.read(st1.arr, 10); // Error happens here 
    } 
    i.close(); 

這反過來又在這裏失敗

int read(T **apBuf, int aNum) 
{ 
    int count=0; 
    apBuf = new T*[aNum]; 
    for (int i = 0;i < aNum;i++) 
    { 

     *apBuf[i] = this->read(); // Error 
     count++; 

    } 
    return count; 


} 

您正在試圖建立一個char *ifstream,因爲這些都是非常不同類型的失敗的。我建議你重新考慮標誌線。我還懷疑你不完全確定ifstream究竟是什麼,所以我建議重新閱讀the documentation
在一個側面節點,你到newapBuf = new T*[aNum];調用不會調用delete事前,這意味着你有一個memory leak

+0

謝謝你試圖回答,但你的回答不是很清楚。 apBuf是一個指向學生的數組。並且this-> read();應該使用cfile方法讀取,它返回由學生c'tor構建的學生獲取fileIn作爲參數。我錯在哪裏? – ntrch