从.txt [c ++]读入代码

时间:2015-07-21 01:48:10

标签: c++ c++11

我正在尝试编写一个从文本文件中的脚本读取的冒险游戏。该程序编译并运行,但它不读取我的.txt文件,我无法弄清楚出了什么问题。

在我的GetAreaInfo函数中

“fin.seekg(NULL,IOS :: BEG);”显示警告说

“main.cpp:92:28:警告:将NULL传递给'std :: basic_istream< _CharT,_Traits>& std :: basic_istream< _CharT,_Traits> :: seekg(std:)的非指针参数1 :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;
}

1 个答案:

答案 0 :(得分:0)

iostream::seekg具有以下签名:

  1. istream& seekg (streampos pos);
  2. istream& seekg (streamoff off, ios_base::seekdir way);
  3. 另一方面,

    NULL是一个空指针常量。

    你可能想写:

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

    或简单地说:

    fin.seekg(0);
    

    这两项都将从一开始就开始寻求。