如何在输入文件中找出未知数量的行和列?

时间:2014-02-21 02:17:58

标签: c++ file-io multidimensional-array

好的,输入文件如下所示:

00000000100000001010 
00000000010000001001
11100000010100000010 
10100100101010101010 
00101010010010101000

这是一个5x20的示例网格,其缺点是行和列可以是任意的。这意味着在开始计算二维数组之前,我需要弄清楚输入文件有多少行和列。

所以我有点困惑,因为现在我只是尝试读取数组,然后将其输出到控制台,而不知道最初的行和列。请帮助我,这很烦人,我找不到办法。

P.S。我不能使用字符串库

2 个答案:

答案 0 :(得分:0)

执行此操作的传统方法是循环遍历char数组中的每个字符,并跟踪字符数,直到您触及换行符,具体取决于数据的格式。

#include <iostream>

using namespace std;

int main()
{
    char arr[] = "00000000100000001010\n00000000010000001001\n11100000010100000010\n10100100101010101010 \n00101010010010101000";
    int cols = 0;
    int rows = 0;

    for(int i = 0; arr[i] != '\0';i++)
    {
        if(rows == 0)
            cols++;
        if(arr[i] == '\n')
            rows++;
    }
    std::cout<<cols<<" Colums"<<std::endl<<rows+1<<" Rows"<<std::endl;
    return 0;
}

这是假设列是统一的,并且您的数据是数组。

从流中逐个字符地阅读更容易/更清洁/更好,但这是旧方法。

答案 1 :(得分:0)

有很多方法可以继续,具体取决于教师禁止使用string背后的动机。下面两个选项之一可能是可以接受的。请注意,我玩得快一点,并且跳过了相当多的错误检查,但是当你充实它时你不应该这样做。在所有情况下,我假设文件没有以行终止符结尾(如你所示)并且是矩形(每行都有相同数量的字符)。

使用自动调整大小容器

在不使用string的情况下,您仍然可以获得免费内存管理的基本好处(针对此案例)。例如,将字符逐个推送到vector

std::ifstream inF("input.txt");
std::vector<char> contents;
char c;

while(inF.get(c).good())
{
    contents.push_back(c);
}

int rows = 1 + std::count(contents.begin(), contents.end(), '\n');
int columns = std::find(contents.begin(), contents.end(), '\n') - contents.begin();

从流

中读出文件的长度

确定文件的大小并预先分配足够大的缓冲区来保存它是一件非常简单的事情:

std::ifstream inF("input.txt");

// option 1
inF.seekg(0, std::ios_base::end);
int charCount = inF.tellg();

// option 2
//int charCount = 0;
//while(inF.get() != std::char_traits<char>::eof())
//{
//    charCount++;
//}
//inF.clear();

char* contents = new char[charCount + 1];

inF.seekg(0);
inF.read(contents, charCount);

contents[charCount] = '\0';

int rows = 1 + std::count(contents, contents + charCount, '\n');
int columns = std::find(contents, contents + charCount, '\n') - contents;

delete[] contents;