​5.1.4 练习 读取文本文件中的神秘数据​

C++自学精简教程 目录(必读)

这个作业你将综合使用之前的知识:char int string vector ifstream cout 函数 auto

1,作业内容

从文本文件 positions.txt 中读取神秘数据,并将数据打印到控制台上。

最终你会打印如下内容:

Windows环境:

Linux环境:

2,输入文件数据格式

下面来介绍神秘数据的格式

神秘数据存放在 main.cpp 同目录下 positions.txt 文本文件中,如下图所示:

positions.txt文件中的内容

文本文件 positions.txt 数据格式的具体含义:

(1)53 19表示显示区域的宽度是width=53,高度是height=19。

可以认为控制台上需要显示19行,每一行53个字符。

width=53,height=19

(2)后面每三个整数为一组。

比如,0 0 32 表示在第0行,第0列,输出一个空格(字符空格的ASCII码数值为32)。

如何将文件中的 32 这个整数输出为字符空格呢?

这是本作业的关键!

可以用下面的程序来完成:

#include <iostream>
using namespace std;

int main()
{
	int ivalue = 32; //这个值可以从文件里读取 ifstream fin; fin >> ivalue;
    char c = static_cast<int>(ivalue);// 将整数转换为字符类型,此时 c 存储的就是字符空格了
	cout << c;//输出空格

	return 0;
}

紧接着,后面的 0 1 32 表示在第0行,第1列,也输出一个空格。

(3)后面的数据以此类推。每三个整数表示一组。

这一组的三个整数:

第一个数,表示在第几行显示 。

第二个数,表示在第几列显示 。

第三个数,表示要显示的字符的ASCII码。

参考:ASCII_百度百科

3,实现思路

我们可以在内存中创建一个width=53,height=19二维数组来存放这些字符。

每个数组元素都是char类型。这样的二维数组逐行逐个元素的输出到屏幕上就是我们希望出现的图形了。

for(int i = 0; i < 19; ++i)
{
    for(int j=0; j < 53; ++j)
    {
        cout<<data[i][j];
     }
    cout<<endl;//输出完一行数据之后输出一个换行符,到下一行接着打印
}

当然,也可以直接把一个string输出到控制台,而不再用一个for循环打印。

为了存储这种2维的数据,我们可以在内存中创建一个二维数组vector<string> data。

第一维用vector表示,第二维用string表示。毕竟string本身就是支持下表访问的一维char数组。

3,程序源码:

#include <vector>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

/*read position data from text file positions.txt
* in vector<string>
*/
vector<string> read_position()
{
    ifstream fin("positions.txt");//用输入文件对象fin打开文本文件position.txt用来读取数据
    if (!fin.is_open())//如果没有找到文件,则输出错误信息并退出程序,返回一个空的二维数组
    {
        std::cout << "error ! can not open file positions.txt!" << std::endl;
        return vector<string>();//调用vector的默认构造函数,返回一个空的vector
    }
    char c = 0;
    int row = 0, col = 0;//用来存放文件中行数和列数

    fin >> col;//先读两个字符w=跳过,再读每一行的列数
    fin >> row;//先读两个字符h=跳过,再读行数。
    //创建一个19行,每行53个字符的二维数组,每个元素的值都是空格(打印的时候看不出打印了)
    vector<string> matrix(row, string(col, ' '));

    while (!fin.eof())
    {
        int x = 0, y = 0, value = 0;
        /*convert int value of char to char
        * for example: int 32  => char ' '
        *              int 61  => char '='
        *              int 124 => char '|'
        *              int 30  => char '$'
        * char c = static_cast<int>(ivalue);//将整形变量转换为字符型变量的示例
        */

        //读取一组数据
        //(1) your code

        //读到一组记录,就把数据信息保存到数组对应位置
        matrix[x][y] = static_cast<char>(value);//类型转换
    }
    return matrix;
}

void print_matrix(const vector<string>& matrix)
{
    //逐行打印
    for (int row = 0; row < matrix.size(); ++row)
    {
        //string可以直接整体打印
        //(2) your code

    }
}
int main(int argc, char* argv[])
{
    //读取数据到二维字符数组
    auto matrix = read_position();
    //打印二维数组
    //(3) your code

    return 0;
}

4,文本文件准备与运行:

positions.txt 文本文件需要你自己手动创建,positions.txt 文件内的完整内容为(需要你手动把下面的内容拷贝到 positions.txt 中去):

53 19
0 0 32 0 1 32 0 2 32 0 3 32 0 4 32 0 5 32 0 6 32 0 7 32 0 8 32 0 9 32 0 10 32 0 11 32 0 12 32 0 13 32 0 14 32 0 15 32 0 16 32 0 17 32 0 18 32 0 19 32 0 20 32 0 21 95 0 22 46 0 23 111 0 24 111 0 25 79 0 26 111 0 27 111 0 28 46 0 29 95 0 30 32 0 31 32 0 32 32 0 33 32 0 34 32 0 35 32 0 36 32 0 37 32 0 38 32 0 39 32 0 40 32 0 41 32 0 42 32 0 43 32 0 44 32 0 45 32 0 46 32 0 47 32 0 48 32 0 49 32 0 50 32 0 51 32 0 52 32 1 0 32 1 1 32 1 2 32 1 3 32 1 4 32 1 5 32 1 6 32 1 7 32 1 8 32 1 9 32 1 10 32 1 11 32 1 12 32 1 13 32 1 14 32 1 15 32 1 16 32 1 17 32 1 18 32 1 19 32 1 20 111 1 21 56 1 22 56 1 23 56 1 24 56 1 25 56 1 26 56 1 27 56 1 28 56 1 29 56 1 30 111 1 31 32 1 32 32 1 33 32 1 34 32 1 35 32 1 36 32 1 37 32 1 38 32 1 39 32 1 40 32 1 41 32 1 42 32 1 43 32 1 44 32 1 45 32 1 46 32 1 47 32 1 48 32 1 49 32 1 50 32 1 51 32 1 52 32 2 0 32 2 1 32 2 2 32 2 3 32 2 4 32 2 5 32 2 6 32 2 7 32 2 8 32 2 9 32 2 10 32 2 11 32 2 12 32 2 13 32 2 14 32 2 15 32 2 16 32 2 17 32 2 18 32 2 19 32 2 20 56 2 21 56 2 22 34 2 23 32 2 24 32 2 25 46 2 26 32 2 27 32 2 28 34 2 29 56 2 30 56 2 31 32 2 32 32 2 33 32 2 34 32 2 35 32 2 36 32 2 37 32 2 38 32 2 39 32 2 40 32 2 41 32 2 42 32 2 43 32 2 44 32 2 45 32 2 46 32 2 47 32 2 48 32 2 49 32 2 50 32 2 51 32 2 52 32 3 0 32 3 1 32 3 2 32 3 3 32 3 4 32 3 5 32 3 6 32 3 7 32 3 8 32 3 9 32 3 10 32 3 11 32 3 12 32 3 13 32 3 14 32 3 15 32 3 16 32 3 17 32 3 18 32 3 19 32 3 20 40 3 21 124 3 22 32 3 23 32 3 24 94 3 25 95 3 26 94 3 27 32 3 28 32 3 29 124 3 30 41 3 31 32 3 32 32 3 33 32 3 34 32 3 35 32 3 36 32 3 37 32 3 38 32 3 39 32 3 40 32 3 41 32 3 42 32 3 43 32 3 44 32 3 45 32 3 46 32 3 47 32 3 48 32 3 49 32 3 50 32 3 51 32 3 52 32 4 0 32 4 1 32 4 2 32 4 3 32 4 4 32 4 5 32 4 6 32 4 7 32 4 8 32 4 9 32 4 10 32 4 11 32 4 12 32 4 13 32 4 14 32 4 15 32 4 16 32 4 17 32 4 18 32 4 19 32 4 20 79 4 21 92 4 22 32 4 23 32 4 24 32 4 25 61 4 26 32 4 27 32 4 28 32 4 29 47 4 30 79 4 31 32 4 32 32 4 33 32 4 34 32 4 35 32 4 36 32 4 37 32 4 38 32 4 39 32 4 40 32 4 41 32 4 42 32 4 43 32 4 44 32 4 45 32 4 46 32 4 47 32 4 48 32 4 49 32 4 50 32 4 51 32 4 52 32 5 0 32 5 1 32 5 2 32 5 3 32 5 4 32 5 5 32 5 6 32 5 7 32 5 8 32 5 9 32 5 10 32 5 11 32 5 12 32 5 13 32 5 14 32 5 15 32 5 16 32 5 17 95 5 18 95 5 19 95 5 20 95 5 21 47 5 22 96 5 23 45 5 24 45 5 25 45 5 26 45 5 27 45 5 28 39 5 29 92 5 30 95 5 31 95 5 32 95 5 33 95 5 34 32 5 35 32 5 36 32 5 37 32 5 38 32 5 39 32 5 40 32 5 41 32 5 42 32 5 43 32 5 44 32 5 45 32 5 46 32 5 47 32 5 48 32 5 49 32 5 50 32 5 51 32 5 52 32 6 0 32 6 1 32 6 2 32 6 3 32 6 4 32 6 5 32 6 6 32 6 7 32 6 8 32 6 9 32 6 10 32 6 11 32 6 12 32 6 13 32 6 14 32 6 15 46 6 16 39 6 17 32 6 18 32 6 19 92 6 20 92 6 21 124 6 22 32 6 23 32 6 24 32 6 25 32 6 26 32 6 27 32 6 28 32 6 29 124 6 30 36 6 31 36 6 32 32 6 33 32 6 34 96 6 35 46 6 36 32 6 37 32 6 38 32 6 39 32 6 40 32 6 41 32 6 42 32 6 43 32 6 44 32 6 45 32 6 46 32 6 47 32 6 48 32 6 49 32 6 50 32 6 51 32 6 52 32 7 0 32 7 1 32 7 2 32 7 3 32 7 4 32 7 5 32 7 6 32 7 7 32 7 8 32 7 9 32 7 10 32 7 11 32 7 12 32 7 13 32 7 14 47 7 15 32 7 16 32 7 17 92 7 18 92 7 19 124 7 20 124 7 21 124 7 22 32 7 23 32 7 24 32 7 25 58 7 26 32 7 27 32 7 28 32 7 29 124 7 30 124 7 31 124 7 32 36 7 33 36 7 34 32 7 35 32 7 36 92 7 37 32 7 38 32 7 39 32 7 40 32 7 41 32 7 42 32 7 43 32 7 44 32 7 45 32 7 46 32 7 47 32 7 48 32 7 49 32 7 50 32 7 51 32 7 52 32 8 0 32 8 1 32 8 2 32 8 3 32 8 4 32 8 5 32 8 6 32 8 7 32 8 8 32 8 9 32 8 10 32 8 11 32 8 12 32 8 13 47 8 14 32 8 15 32 8 16 95 8 17 124 8 18 124 8 19 124 8 20 124 8 21 124 8 22 32 8 23 32 8 24 45 8 25 58 8 26 45 8 27 32 8 28 32 8 29 124 8 30 124 8 31 124 8 32 124 8 33 124 8 34 45 8 35 32 8 36 32 8 37 92 8 38 32 8 39 32 8 40 32 8 41 32 8 42 32 8 43 32 8 44 32 8 45 32 8 46 32 8 47 32 8 48 32 8 49 32 8 50 32 8 51 32 8 52 32 9 0 32 9 1 32 9 2 32 9 3 32 9 4 32 9 5 32 9 6 32 9 7 32 9 8 32 9 9 32 9 10 32 9 11 32 9 12 32 9 13 124 9 14 32 9 15 32 9 16 32 9 17 124 9 18 32 9 19 92 9 20 92 9 21 92 9 22 32 9 23 32 9 24 32 9 25 45 9 26 32 9 27 32 9 28 32 9 29 36 9 30 36 9 31 47 9 32 32 9 33 124 9 34 32 9 35 32 9 36 32 9 37 124 9 38 32 9 39 32 9 40 32 9 41 32 9 42 32 9 43 32 9 44 32 9 45 32 9 46 32 9 47 32 9 48 32 9 49 32 9 50 32 9 51 32 9 52 32 10 0 32 10 1 32 10 2 32 10 3 32 10 4 32 10 5 32 10 6 32 10 7 32 10 8 32 10 9 32 10 10 32 10 11 32 10 12 32 10 13 124 10 14 32 10 15 92 10 16 95 10 17 124 10 18 32 10 19 32 10 20 39 10 21 39 10 22 92 10 23 45 10 24 45 10 25 45 10 26 45 10 27 45 10 28 47 10 29 39 10 30 39 10 31 32 10 32 32 10 33 124 10 34 32 10 35 32 10 36 32 10 37 124 10 38 32 10 39 32 10 40 32 10 41 32 10 42 32 10 43 32 10 44 32 10 45 32 10 46 32 10 47 32 10 48 32 10 49 32 10 50 32 10 51 32 10 52 32 11 0 32 11 1 32 11 2 32 11 3 32 11 4 32 11 5 32 11 6 32 11 7 32 11 8 32 11 9 32 11 10 32 11 11 32 11 12 32 11 13 92 11 14 32 11 15 32 11 16 46 11 17 45 11 18 92 11 19 95 11 20 95 11 21 95 11 22 32 11 23 32 11 24 96 11 25 45 11 26 96 11 27 32 11 28 32 11 29 95 11 30 95 11 31 95 11 32 95 11 33 47 11 34 45 11 35 46 11 36 32 11 37 47 11 38 32 11 39 32 11 40 32 11 41 32 11 42 32 11 43 32 11 44 32 11 45 32 11 46 32 11 47 32 11 48 32 11 49 32 11 50 32 11 51 32 11 52 32 12 0 32 12 1 32 12 2 32 12 3 32 12 4 32 12 5 32 12 6 32 12 7 32 12 8 32 12 9 32 12 10 32 12 11 95 12 12 95 12 13 95 12 14 96 12 15 46 12 16 32 12 17 46 12 18 39 12 19 32 12 20 32 12 21 32 12 22 47 12 23 45 12 24 45 12 25 46 12 26 45 12 27 45 12 28 92 12 29 32 12 30 32 12 31 32 12 32 96 12 33 46 12 34 32 12 35 46 12 36 32 12 37 95 12 38 95 12 39 95 12 40 32 12 41 32 12 42 32 12 43 32 12 44 32 12 45 32 12 46 32 12 47 32 12 48 32 12 49 32 12 50 32 12 51 32 12 52 32 13 0 32 13 1 32 13 2 32 13 3 32 13 4 32 13 5 32 13 6 32 13 7 32 13 8 46 13 9 34 13 10 34 13 11 32 13 12 39 13 13 60 13 14 32 13 15 32 13 16 96 13 17 46 13 18 95 13 19 95 13 20 95 13 21 95 13 22 92 13 23 95 13 24 60 13 25 124 13 26 62 13 27 95 13 28 47 13 29 95 13 30 95 13 31 95 13 32 95 13 33 46 13 34 39 13 35 32 13 36 32 13 37 62 13 38 39 13 39 34 13 40 34 13 41 46 13 42 32 13 43 32 13 44 32 13 45 32 13 46 32 13 47 32 13 48 32 13 49 32 13 50 32 13 51 32 13 52 32 14 0 32 14 1 32 14 2 32 14 3 32 14 4 32 14 5 32 14 6 124 14 7 32 14 8 124 14 9 32 14 10 58 14 11 32 14 12 32 14 13 96 14 14 45 14 15 32 14 16 92 14 17 96 14 18 46 14 19 59 14 20 96 14 21 46 14 22 92 14 23 32 14 24 95 14 25 32 14 26 47 14 27 96 14 28 96 14 29 59 14 30 46 14 31 96 14 32 47 14 33 32 14 34 45 14 35 32 14 36 96 14 37 32 14 38 58 14 39 32 14 40 124 14 41 32 14 42 124 14 43 32 14 44 32 14 45 32 14 46 32 14 47 32 14 48 32 14 49 32 14 50 32 14 51 32 14 52 32 15 0 32 15 1 32 15 2 32 15 3 32 15 4 32 15 5 32 15 6 92 15 7 32 15 8 32 15 9 92 15 10 32 15 11 96 15 12 45 15 13 46 15 14 32 15 15 32 15 16 32 15 17 92 15 18 95 15 19 32 15 20 95 15 21 95 15 22 95 15 23 92 15 24 32 15 25 47 15 26 95 15 27 95 15 28 95 15 29 32 15 30 95 15 31 47 15 32 32 15 33 32 15 34 32 15 35 46 15 36 45 15 37 96 15 38 32 15 39 47 15 40 32 15 41 32 15 42 47 15 43 32 15 44 32 15 45 32 15 46 32 15 47 32 15 48 32 15 49 32 15 50 32 15 51 32 15 52 32 16 0 32 16 1 61 16 2 61 16 3 61 16 4 61 16 5 61 16 6 61 16 7 61 16 8 61 16 9 96 16 10 45 16 11 46 16 12 95 16 13 95 16 14 95 16 15 95 16 16 96 16 17 45 16 18 46 16 19 95 16 20 95 16 21 95 16 22 95 16 23 92 16 24 95 16 25 95 16 26 95 16 27 95 16 28 95 16 29 47 16 30 95 16 31 95 16 32 95 16 33 95 16 34 46 16 35 45 16 36 96 16 37 95 16 38 95 16 39 95 16 40 95 16 41 46 16 42 45 16 43 39 16 44 61 16 45 61 16 46 61 16 47 61 16 48 61 16 49 61 16 50 61 16 51 61 16 52 32 17 0 32 17 1 32 17 2 32 17 3 32 17 4 32 17 5 32 17 6 32 17 7 32 17 8 32 17 9 32 17 10 32 17 11 32 17 12 32 17 13 32 17 14 32 17 15 32 17 16 32 17 17 32 17 18 32 17 19 32 17 20 32 17 21 32 17 22 32 17 23 96 17 24 61 17 25 45 17 26 45 17 27 45 17 28 61 17 29 39 17 30 32 17 31 32 17 32 32 17 33 32 17 34 32 17 35 32 17 36 32 17 37 32 17 38 32 17 39 32 17 40 32 17 41 32 17 42 32 17 43 32 17 44 32 17 45 32 17 46 32 17 47 32 17 48 32 17 49 32 17 50 32 17 51 32 17 52 32 18 0 60 18 1 94 18 2 94 18 3 94 18 4 94 18 5 94 18 6 94 18 7 94 18 8 94 18 9 94 18 10 94 18 11 94 18 12 94 18 13 94 18 14 94 18 15 94 18 16 94 18 17 94 18 18 94 18 19 94 18 20 94 18 21 94 18 22 94 18 23 94 18 24 94 18 25 94 18 26 94 18 27 94 18 28 94 18 29 94 18 30 94 18 31 94 18 32 94 18 33 94 18 34 94 18 35 94 18 36 94 18 37 94 18 38 94 18 39 94 18 40 94 18 41 94 18 42 94 18 43 94 18 44 94 18 45 94 18 46 94 18 47 94 18 48 94 18 49 94 18 50 94 18 51 94 18 52 62

编译运行:

1,Windows

(1)直接用VS2022新建控制台项目,创建main.cpp,把代码拷贝进去。

把你的positions.txt文件放到main.cpp同目录即可。

Ctrl+F5 即可运行看到结果。

(2)如果是用VS2022 打开 CMake 文件夹,则需要把positions.txt文件放到 \out\build\x64-Debug 目录里。这样程序才能读取到文本文件。

2,Linux

使用下面的命令,将 main.cpp 源文件编译生成 main 可执行文件。

g++ main.cpp -o main

并把 positions.txt 文件放到main可执行程序同目录,执行下面的命令即可:

./main

学生反馈

(1)

如需答案和答疑:请私信。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值