从文本文件读取所有内容,直到空白

时间:2019-12-10 15:47:09

标签: c++ c++11 path-finding

(C ++)我创建了一个函数来打开文本文件并将内容分配给数组。数组中的前2个元素是网格的大小。但是,如果前两个数字中的一个或两个都是两位数,则不会将其读为两位数。有什么办法吗?

int openMap()
{
    std::string fileName;

    std::cout << "Please enter the file name with extension that you want to open: ";
    std::cin >> fileName;

    system("CLS");

    std::ifstream file(fileName);           //OPENS MAP FILE

    int tmp;
    int i = 0;

    if (!file.is_open())                    //CHECKS IF THE MAP FILE HAS OPENED CORRECTLY
    {
        std::cout << "Error Occured!\nCould not open file.";

        return 0;
    }

    while (!file.eof())                     //READS THE MAP FILE AND PASSES THE INFORMATION INTO AN ARRAY
    {
        file >> tmp;
        checkNumber(tmp);
        if (valid == true)                  //IF THE CHARACTER IS NOT A NUMBER THEN IT WONT BE PASSED INTO THE ARRAY
        {
            tmpArray[i] = tmp;
            i++;
            valid = false;
        }
        row = tmpArray[1];              //ASSIGNS THE FIRST 2 NUMBERS OF THE MAP FILE TO ROW AND COL VARIABLES
        col = tmpArray[0];
    }

    return row, col;
}

我认为我必须重写

file >> tmp

以某种不同的方式,但不确定如何。 有没有一种方法可以浏览文本文件,直到遇到空白?

文本文件内容如下

  

6 4 0 0 1 0 0 0 2 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 3 0

(6或4或两者都可以是两位数)

编辑:

    for (int j = 0; j < row; j++)
    {
        for (int k = 0; k < col; k++)
        {
            _map[j][k] = tmpArray[l];
            std::cout << _map[j][k] << " ";
            l++;
        }
    }   

3 个答案:

答案 0 :(得分:1)

代码中有很多错误,您可能应该使用调试器来逐步检查并确定程序的哪些部分工作异常。

while(!file.eof())
    file >> tmp;
    checkNumber(tmp);
    if (valid == true)                  //IF THE CHARACTER IS NOT A NUMBER THEN IT WONT BE PASSED INTO THE ARRAY
    {
        tmpArray[i] = tmp;
        i++;
        valid = false;
    }
    row = tmpArray[1];              //ASSIGNS THE FIRST 2 NUMBERS OF THE MAP FILE TO ROW AND COL VARIABLES
    col = tmpArray[0];

您需要在循环的每个迭代中设置row=tmpArray[1]col = tmpArray[0],这不仅是不必要的而且也是不正确的,特别是因为在没有任何内容的情况下,正在i=0上执行row = tmpArray [1]已放置在tmpArray[1]中。

编辑:这是一个小得多的变量,由于较少的变量和类型转换,因此更不容易出错,并且更易于阅读:

int row,col;

//Add error checking here
cin >> col;
cin >> row;

cout << "Cols: " << col << " Rows: " << row << endl;

vector<vector<int> >_map(row, vector<int>(col,0));

for(int j=0; j < row; j++)
{
    for(int k=0; k < col; k++)
    {
        int tmp;
        cin >> tmp;
        //Add error checking for tmp
        _map[j][k] = tmp;
        cout << _map[j][k] << endl;
    }
}

答案 1 :(得分:1)

您的代码存在一些问题。首先,函数的返回类型为int,但是您将返回多个值。这是一个完整的正在运行的代码,应该可以解决您的问题。

#include <iostream>
#include <fstream>
#include <vector>

std::vector< std::vector<int> > openMap() {
    std::string fileName;

    std::cout << "Please enter the file name with extension that you want to open: ";
    std::cin >> fileName;

    std::fstream myfile(fileName, std::ios_base::in);
    int row, col;
    myfile >> row;
    myfile >> col;

    int a;
    std::vector< std::vector<int> > retval;
    for (int i = 0; i < row; i++) {
        std::vector<int> v1;
        for (int j = 0; j < col; j++) {
            myfile >> a;
            v1.push_back(a);
        }
        retval.push_back(v1);
    }
    return retval;
}


int main(int argc, char * argv[])
{
    std::vector< std::vector<int> > _map = openMap();

    for(int i = 0; i < _map.size(); i++) {
        for (int j = 0; j < _map[i].size(); j++) {
            std::cout << _map[i][j] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

答案 2 :(得分:0)

我想不会有那么多人感兴趣。但是请在下面查看您问题的可能解决方案。

该代码使用现代C ++算法。

这非常简单明了。

#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>


int main() {

    // Ask user, to give a filename
    std::cout << "Please enter the file name with extension that you want to open: ";

    // Get the filename from the user
    if (std::string fileName; std::cin >> fileName) {

        // Open the file and check, if it is open
        if (std::ifstream sourceFile(fileName); sourceFile) {

            // Read the number of rows and columns of the matrix
            if (size_t numberOfColumns, numberOfRows;  sourceFile >> numberOfColumns >> numberOfRows) {

                // Create a matrix with the given number of rows and columns
                std::vector<std::vector<int>> result(numberOfRows, std::vector<int>(numberOfColumns, 0));

                // Read data from the input stream and put it into the matrix
                for (size_t i = 0; i < numberOfRows; ++i) {
                    std::copy_n(std::istream_iterator<int>(sourceFile), numberOfColumns, result[i].begin());
                }

                // Print result. Go through all lines and then copy line elements to std::cout
                std::for_each(result.begin(), result.end(), [](std::vector<int>& c) {
                    std::copy(c.begin(), c.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << "\n";   });
            }
        }
        else {
            std::cerr << "\n*** Error: Could not open source File\n\n";
        }
    }
    return 0;
}