尝试将文本文件(ifstream)转换为 C++ 中的二维字符数组
Trying to convert a text file (ifstream) into a 2D array of chars in c++
我已经尝试了大约 2 天,我想我已经接近了,但仍然没有雪茄!
我有一个如下所示的文本文件:
++++++
+H +
+ +
+ +
+ X+
++++++
如果我尝试正常打印出来,一切正常:
void Level::LevelPrinter() //This prints out fine
{
inputMap.open("Level1.txt");
string input;
while (getline(inputMap, input))
{
cout << input << endl;
}
}
但是当我尝试将所有这些符号放入二维数组时,我要么在我尝试过的某些形式的代码中得到空白;或者,在我最近的尝试中,似乎最接近我的需要,我将奇怪的符号放在正确的位置。我不知道怎么了...
这是我现在正在尝试的代码:
void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");
char MapSymbols;
int Rows, Cols;
{
for (Rows = 0; Rows < 6; Rows++)
{
for (Cols = 0; Cols < 6; Cols++)
{
inputMap >> MapSymbols;
MapLayoutArray[Rows][Cols] = MapSymbols;
cout << MapSymbols;
}
cout << endl;
}
}
}
这就是控制台显示的内容:
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
顺便说一句,MapLayoutArray 只是:
char MapLayoutArray[6][6];
RadLexus,我试过不使用 >> 所以它看起来像这样:
void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");
char MapSymbols;
int Rows, Cols;
{
for (Rows = 0; Rows < 6; Rows++)
{
for (Cols = 0; Cols < 6; Cols++)
{
inputMap.get(MapSymbols);
MapLayoutArray[Rows][Cols] = MapSymbols;
cout << MapSymbols;
}
cout << endl;
}
}
}
这也打印出:
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
-----更新------
在第一个代码上使用 .close(我说的那个可以正常工作)。使第二个代码上的字符显示为普通字符!问题是 - 他们现在看起来像这样:
++++++
+H
+
+
+
+
+
+
X+
+
玩了一下代码,现在是这个代码:
void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");
char MapSymbols;
{
for (int Rows = 0; Rows < 6; Rows++)
{
for (int Cols = 0; Cols < 6; Cols++)
{
inputMap.get(MapSymbols);
if (MapSymbols != '\n')
{
MapLayoutArray[Rows][Cols] = MapSymbols;
cout << MapSymbols;
}
else
{
cout << endl;
}
}
}
}
inputMap.close();
cout << endl;
}
导致这个:
++++++
+H +
+ +
+ +
+ X+
+
Press any key to continue . . .
所以我非常接近,但我无法让它打印最后一行。我尝试了很多方法来让它打印最后一行,比如制作第一个 for 循环 "Rows <= 6" 但是正确打印出最后一行并使控制台崩溃并出现错误...
我会再玩这个......如果你们有任何想法,请告诉我。如果我弄明白了,我会在这里更新...
第一次尝试
inputMap >> MapSymbols;
运算符 >> 忽略所有白色字符,包括空格。
第二次和第三次尝试
inputMap.get(MapSymbols);
使用正确的函数来考虑空格,但是你忘记了当你获得一个换行符时'\n'
,你不能等待下一次迭代来读取(好的)下一个字符。您可能还会遇到 '\r'
,具体取决于 OS。
一个解决方案
您可以使用 std::ws
来跳过每行末尾的这些空格1:
for (std::size_t Rows = 0; Rows < 6; Rows++)
{
for (std::size_t Cols = 0; Cols < 6; Cols++)
{
char MapSymbols;
inputMap.get(MapSymbols);
MapLayoutArray[Rows][Cols] = MapSymbols;
std::cout << MapSymbols;
}
inputMap >> std::ws; // HERE
std::cout << std::endl;
}
1假设行不以空格开头,否则使用ignore()成员函数。
我试图在我的电脑上解决你的问题。
我所做的更改是我迭代当前行并将其插入数组一个字符一个字符。
此代码运行良好:
#include <string>
#include <iostream>
#include <fstream>
int main(){
std::ifstream inputMap("C:\Res\Level1.txt");
char arr[6][6];
for (int i = 0; i < 6; i++)
{
std::string input;
std::getline(inputMap, input);
for (int k = 0; k < input.length(); k++)
{
arr[i][k] = input[k];
std::cout << input[k];
}
std::cout << std::endl;
}
std::cout << std::endl;
for (size_t l = 0; l < 6; l++)
{
for (size_t m = 0; m < 6; m++)
{
std::cout << arr[l][m];
}
std::cout << std::endl;
}
system("PAUSE");
return 0;
}
输出如愿(我复制到这里了)
出于您的目的,只是不要在第一次或第二次打印它;)
++++++
+H +
+ +
+ +
+ X+
++++++
++++++
+H +
+ +
+ +
+ X+
++++++
我已经尝试了大约 2 天,我想我已经接近了,但仍然没有雪茄! 我有一个如下所示的文本文件:
++++++
+H +
+ +
+ +
+ X+
++++++
如果我尝试正常打印出来,一切正常:
void Level::LevelPrinter() //This prints out fine
{
inputMap.open("Level1.txt");
string input;
while (getline(inputMap, input))
{
cout << input << endl;
}
}
但是当我尝试将所有这些符号放入二维数组时,我要么在我尝试过的某些形式的代码中得到空白;或者,在我最近的尝试中,似乎最接近我的需要,我将奇怪的符号放在正确的位置。我不知道怎么了...
这是我现在正在尝试的代码:
void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");
char MapSymbols;
int Rows, Cols;
{
for (Rows = 0; Rows < 6; Rows++)
{
for (Cols = 0; Cols < 6; Cols++)
{
inputMap >> MapSymbols;
MapLayoutArray[Rows][Cols] = MapSymbols;
cout << MapSymbols;
}
cout << endl;
}
}
}
这就是控制台显示的内容:
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
顺便说一句,MapLayoutArray 只是:
char MapLayoutArray[6][6];
RadLexus,我试过不使用 >> 所以它看起来像这样:
void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");
char MapSymbols;
int Rows, Cols;
{
for (Rows = 0; Rows < 6; Rows++)
{
for (Cols = 0; Cols < 6; Cols++)
{
inputMap.get(MapSymbols);
MapLayoutArray[Rows][Cols] = MapSymbols;
cout << MapSymbols;
}
cout << endl;
}
}
}
这也打印出:
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
-----更新------
在第一个代码上使用 .close(我说的那个可以正常工作)。使第二个代码上的字符显示为普通字符!问题是 - 他们现在看起来像这样:
++++++
+H
+
+
+
+
+
+
X+
+
玩了一下代码,现在是这个代码:
void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");
char MapSymbols;
{
for (int Rows = 0; Rows < 6; Rows++)
{
for (int Cols = 0; Cols < 6; Cols++)
{
inputMap.get(MapSymbols);
if (MapSymbols != '\n')
{
MapLayoutArray[Rows][Cols] = MapSymbols;
cout << MapSymbols;
}
else
{
cout << endl;
}
}
}
}
inputMap.close();
cout << endl;
}
导致这个:
++++++
+H +
+ +
+ +
+ X+
+
Press any key to continue . . .
所以我非常接近,但我无法让它打印最后一行。我尝试了很多方法来让它打印最后一行,比如制作第一个 for 循环 "Rows <= 6" 但是正确打印出最后一行并使控制台崩溃并出现错误... 我会再玩这个......如果你们有任何想法,请告诉我。如果我弄明白了,我会在这里更新...
第一次尝试
inputMap >> MapSymbols;
运算符 >> 忽略所有白色字符,包括空格。
第二次和第三次尝试
inputMap.get(MapSymbols);
使用正确的函数来考虑空格,但是你忘记了当你获得一个换行符时'\n'
,你不能等待下一次迭代来读取(好的)下一个字符。您可能还会遇到 '\r'
,具体取决于 OS。
一个解决方案
您可以使用 std::ws
来跳过每行末尾的这些空格1:
for (std::size_t Rows = 0; Rows < 6; Rows++)
{
for (std::size_t Cols = 0; Cols < 6; Cols++)
{
char MapSymbols;
inputMap.get(MapSymbols);
MapLayoutArray[Rows][Cols] = MapSymbols;
std::cout << MapSymbols;
}
inputMap >> std::ws; // HERE
std::cout << std::endl;
}
1假设行不以空格开头,否则使用ignore()成员函数。
我试图在我的电脑上解决你的问题。
我所做的更改是我迭代当前行并将其插入数组一个字符一个字符。
此代码运行良好:
#include <string>
#include <iostream>
#include <fstream>
int main(){
std::ifstream inputMap("C:\Res\Level1.txt");
char arr[6][6];
for (int i = 0; i < 6; i++)
{
std::string input;
std::getline(inputMap, input);
for (int k = 0; k < input.length(); k++)
{
arr[i][k] = input[k];
std::cout << input[k];
}
std::cout << std::endl;
}
std::cout << std::endl;
for (size_t l = 0; l < 6; l++)
{
for (size_t m = 0; m < 6; m++)
{
std::cout << arr[l][m];
}
std::cout << std::endl;
}
system("PAUSE");
return 0;
}
输出如愿(我复制到这里了)
出于您的目的,只是不要在第一次或第二次打印它;)
++++++
+H +
+ +
+ +
+ X+
++++++
++++++
+H +
+ +
+ +
+ X+
++++++