【问题标题】:Read in a file for word search game C++读入单词搜索游戏 C++ 的文件
【发布时间】:2013-12-09 19:12:45
【问题描述】:

我正在尝试读取一个文件并创建一个 2D 向量来存储用于单词搜索游戏的游戏板,但我似乎无法让它读取比第一行更多的内容。我确定它很小,但我为“板”矢量放置了一个测试显示,显示的只是文本文件的第一行。

这是我的一些代码:

'Board.cpp'

#include "stdafx.h"
#include "Board.h"
#include <fstream>
#include <iostream>
using namespace std;


Board::Board(void)
: rows(0)
{
}


Board::~Board(void)
{
}

void Board::readInFile(void)
{
    ifstream indata;
    indata.open("Puzzle.txt");
    indata >> rows;
    for(int i = 0; i < rows; i++){
        char tmpChar;
        for(int j = 0; j < rows; j++){
            indata >> tmpChar;
            row.push_back(tmpChar);
        }
        board.push_back(row);
    }
    indata.close();
}

'Board.h'

#pragma once
#include <vector>
using namespace std;
class Board
{
public:
    Board(void);
    ~Board(void);
    void readInFile(void);
protected:
    vector<vector<char>> board;
    vector<char>row;    
protected:
    int rows;
};

这是文本文件的设置方式:

16

BDXWASEESPHWEBGB

SIGJVAWDFLCTZIAM

ENKVESMARNAEBRRI

IKOEOPZLUKMVJDDL

KLIRELOBSNPOFWEC

SBOHKLLRHSIFPANA

RSKWMEEEPEITPTPE

EZPIELLLYMOOQCDH

TAWDLGGLZBUNDHOJ

ASIOJNFOPKAJAPBP

WLRCIILROZXLSCID

滑板GCLCIA

LLABESABIVOTNVVE

VOFRISBEETMIEVZG

BWADEVAUCYCSWING

XNJFJPZHBTBFTSAW

【问题讨论】:

  • 为什么会有嵌套的for循环?您一次阅读一个字符。去阅读这个 - cplusplus.com/doc/tutorial/files
  • 我猜你需要在 board.push_back(row); 后清空行;
  • 在将row 附加到rows 之后,您并没有清除它,并且您没有考虑换行符。

标签: c++ vector fstream ifstream


【解决方案1】:

有更好的方法来处理输入文件。首先,不要使用vector&lt;char&gt;,而是使用std::string,而不是使用vector&lt;vector&lt;char&gt; &gt;,而是使用vector&lt;string&gt;。如果仅用于填充board,我不确定我是否理解为什么row 是该类的成员。任何时候您需要板子中的最后一个项目,您都可以使用board.back()*board.rbegin()

void Board::readInFile(void)
{
    ifstream indata("Puzzle.txt", ios::in);
    if(!ifstream.is_open())
        return;
    indata >> rows;    //you don't really need to do this if you take 
                         //the row count out of the file, but if you can't 
                         //change the file, leave it in so as not to corrupt 
                         //the loop that follows
    string line;
    while(getline(indata, line)){
        board.push_back(line);
    }
    indata.close();
}

真的,您不需要让文件存储rows 变量。


如果 readInFile 将文件名作为参数,您的函数也将更具可重用性,因此它可以打开任何内容,而不仅仅是一个特定的文件名。

【讨论】:

  • 我设置它的主要原因是在文本文件中的字母之后是我需要输入和搜索的单词列表。所以我猜 while() 会比我设置单词搜索需要的更多。
  • 啊,你的问题没有具体说明。在这种情况下,您可以将getline() 移动到基于rows 数字迭代的循环内。或者,如果该行仅包含该中断字符(并且可能是换行符),您可以在文件中的字母后面添加一个中断字符,然后在循环中使用 break
  • 是的,抱歉没有提到。我可以使用'字符串线;'如果板向量是'vector> board;'。这是课堂作业,我假设他告诉我们使用“char”是为了便于搜索单个字母以将其与单词匹配。
  • 不,我不认为赋值运算符是为vector&lt;char&gt; = string 定义的。我不明白他为什么要告诉你使用char。搜索字符串的各个字母并不难。请参阅此文档:en.cppreference.com/w/cpp/string/basic_string 或此教程:cprogramming.com/tutorial/string.html
  • 不要 close 本地 fstream。它将被析构函数 (RAII) 关闭。如果将istream&amp; 作为参数传递,将更加可重用,而将流的具体类型留给调用者选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多