好的,输入文件如下所示:
00000000100000001010
00000000010000001001
11100000010100000010
10100100101010101010
00101010010010101000
这是一个5x20的示例网格,其缺点是行和列可以是任意的。这意味着在开始计算二维数组之前,我需要弄清楚输入文件有多少行和列。
所以我有点困惑,因为现在我只是尝试读取数组,然后将其输出到控制台,而不知道最初的行和列。请帮助我,这很烦人,我找不到办法。
P.S。我不能使用字符串库
答案 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;