2015-07-21 91 views
0

我想編碼一個冒險遊戲,從文本文件上的腳本讀取。該程序編譯並運行,但它不會從我的.txt文件讀取,我無法弄清楚什麼是錯誤的。從.txt讀入代碼[C++]

在我GetAreaInfo函數的行

「fin.seekg(NULL,IOS :: BEG);」顯示一個警告說

「的main.cpp:92:28:警告:傳遞NULL非指針參數1「的std :: basic_istream < _CharT,_Traits> &的std :: basic_istream < _CharT,_Traits> :: seekg(std :: basic_istream < _CharT,_Traits> :: off_type,std :: ios_base :: seekdir)[with _CharT = char; _Traits = std :: char_traits; std :: basic_istream < _CharT,_Traits> :: off_type = long int; std :: ios_base :: seekdir = std :: _ Ios_Seekdir]'[-Wconversion-null]「

我不知道如何讓這個消失,但我相信這是問題。任何幫助,將不勝感激

[代碼]

//file libraries 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <windows.h> 
using namespace std; 

#define GAMEFILE "world.txt"//read in for the world data 
#define CONTINUE 1 
#define QUIT   0 

//user libraries 
struct tArea{//structure that holds the info for the main area 

    string strCurrentArea;//name of current area 
    string strDescription;//description of current area 
    string strNorth;//name of area to the north 
    string strSouth;//name of area to the south 
    string strEast;//name of area to the east 
    string strWest;//name of area to the west 

}; 
//global constants 

//function prototypes 
void DisplayArea(tArea &area); 
void GetAreaInfo(ifstream&,tArea &area); 
void Move(ifstream&,tArea &area,string); 
int Input(ifstream&,tArea &area); 
//execution 
int main(){ 

    ifstream fin;//pointer that opens and reads from file 
    tArea area;//area structure data 

    fin.open(GAMEFILE);// 

    if(fin.fail()){ 
     cout<<"UNABLE TO FIND GAME FILE\n"; 

     return -1; 
    } 
    fin>>area.strCurrentArea>>area.strCurrentArea;//reads in the start point for the game 

    GetAreaInfo(fin,area);//calls function to receive info from the file 

    DisplayArea(area);//calls function to display the area to the user 

    while(1){//main game loop 


     if(Input(fin,area)==QUIT){//if user enters quit, game ends 

      break; 
     } 
    } 

    fin.close();//closes file 

    Sleep(1000);//1 second delay before ending 

    return 0; 
} 
/**********************************************************/ 
//*****************DisplayArea*****************************/ 
//******Function is called to display area description*****/ 
/**********************************************************/ 
void DisplayArea(tArea &area) 
{ 

    cout<<area.strDescription<<endl<<endl;  
} 
/**********************************************************/ 
//*****************GetAreaInfo*****************************/ 
//******Function is called to read in the area*************/ 
//************information from the file********************/ 
/**********************************************************/ 
void GetAreaInfo(ifstream &fin,tArea &area){ 

    string strTemp=""; 
    string strTemp2="";//temporary for reading in info 

    string strArea="<"+area.strCurrentArea+">";//looks for the room name in brackets to find easier i.e instead of main it reads in <main> 

    fin.seekg(NULL,ios::beg);//starts the header search from the beginning of the file 

    fin.clear();//allows the file to be read through multiple times 

    while(getline(fin, strTemp, '\n')){//while loop reads file til it finds the correct area heading 

     if(strTemp==strArea){ 

      getline(fin, area.strDescription, '*');//if it finds the correct area heading, it reads its info  

      // Read past the direction blocks (I.E. <north>) and store the room name for that direction 
      fin>>strTemp>>area.strNorth;     
      fin>>strTemp>>area.strEast;    
      fin>>strTemp>>area.strSouth;     
      fin>>strTemp>>area.strWest;//it then read in the surrounding area titles by skipping their <area> descriptors    


      return;         
     } 
    } 
} 
/**********************************************************/ 
//*********************Move********************************/ 
//******Function is called to move through the*************/ 
//****game if there is an area in that direction***********/ 
/**********************************************************/ 
void Move(ifstream &fin,tArea &area, string strArea){ 

    if(strArea=="None"){//detects if there is no area in the direction inputted    

     cout<<"You are unable to travel that way\n";//displays error message and returns the function 
     return;         
    } 
    else{ 

     area.strCurrentArea=strArea;// Sets the current area to the new one 

    GetAreaInfo(fin, area); // Passes in the file pointer so the new area data is read 

    DisplayArea(area);// Displays current area 

    } 
} 
/**********************************************************/ 
//*********************Input*******************************/ 
//******Main game mechanic feature. Receives **************/ 
//****user input and reacts to it accordingly to **********/ 
//*******progress through the game*************************/ 
/**********************************************************/ 
int Input(ifstream &fin, tArea &area){ 

    string strInput="";//holds user input 

    cout<<endl<<":";//displays prompt 
    cin>>strInput;//reads in the user input 

    if(strInput=="look"){ 
     DisplayArea(area);//calls function to give current area description 
    } 
    else if(strInput=="north"){ 
     Move(fin,area,area.strNorth);//calls function to move north if possible 
    } 
    else if(strInput=="east"){ 
     Move(fin,area,area.strEast);//calls function to move east if possible 
    } 
    else if(strInput=="west"){ 
     Move(fin,area,area.strWest);//calls function to move west is possible 
    } 
    else if(strInput=="south"){//calls function to move south if possible 
     Move(fin,area,area.strSouth); 
    } 
    else if(strInput=="help"||strInput=="?"){//displays commands to user 
     cout<<"Commands: north east west south look quit help\n"; 
    } 
    else if(strInput=="quit"){//ends game 
     cout<<"Quit game?\n"; 
     return QUIT; 
    } 
    else{//displays when invalid input is received 
     cout<<"Invalid input\n"; 
    } 

    return CONTINUE; 
} 

回答

0

iostream::seekg具有以下特徵:

  1. istream& seekg (streampos pos);
  2. istream& seekg (streamoff off, ios_base::seekdir way);

NULL,另一方面是空指針常量。

你大概的意思寫:

fin.seekg(0, ios::beg); 

或者乾脆:

fin.seekg(0); 

這兩項將從頭開始尋找。

+0

謝謝你向我展示我的錯誤。我糾正了代碼行並重新編寫了代碼。我沒有收到任何錯誤,但代碼仍然錯誤地閱讀。我已經加倍檢查了我的代碼,並且我沒有遇到錯誤的讀取。我猜測它是在GetAreaInfo函數的其他地方,但我找不到錯誤。 – user2844131