这篇是针对推箱子游戏而写的,某个时候在学C语言,最近转到windows设计,不知道是否有同样的感受,后面的东西学了,前面的就有点生疏了。其实,我的理解是,注意力转移了,当集中于当前问题的时候就会忽略以前的某些知识。这也说明,人的注意力是随着时间,学习内容的不同在起变化。但是,只要稍微复习一下就能很快恢复。

问题:比如一个文本文件的内容如下:

[1]
0000000000000000
0000000000000000
0000000000000000
0000011100000000
0000013100000000
0000012111100000
0001114243100000
0001324611100000
0001111410000000
0000001310000000
0000001110000000
0000000000000000
0000000000000000
0000000000000000
[2]
0000000000000000
0000000000000000
0001111100000000
0001622100000000
0001244101110000
0001242101310000
..................(截选)

[]内是序号,往下延伸,每个[]下面是14行16列的数据,我想获取给定的某个序号下面的这个二维数组数据,比如说,序号[10]下面的14*16列的数据。

————————————————————————————————————————————————————————————

在这个问题之前,首先理解一下流的概念,简易记录一下:

流有很多种,包括输入流,输出流等,这里只说输入流,比如stdin,在调用scanf函数读取这个流的时候,有几个需要注意的要点:
首先,scanf忽略前面的空格,回车等等字符
其次,在读取的时候,流中还有一个指针在不停的移动,也就是游标。做个图来说明:

想输入一个数据ABCD到字符串中,在开始的时候,故意敲入空格+回车键,这对scanf无影响,它会忽略,一直读取ABCD,又遇到一个回车,游标最终停留在回车这个字符上。

这个回车键被scanf获取了吗?其实是没有的,比如接下来可以用c=getchar(),就可以捕捉到这个回车字符。

同理,将stdin换成文件fp,一样遵循这个规则。因为不是专项整理流的问题,所以只简单概括到这。

————————————————————————————————————————————————————————

对于上题的解法是,从fp中读取一个字符串,然后和待匹配的序号比较,比如和字符串"[10]"比较,如果相等,则游标就定位在[10]之后的位置。

观察上面的文本文件,每一行之后就是一个回车,所以每次从fp中读取一个串,要么读的是[xx],要么读的就是二维数组的一行数据,当然,这个串的存储长度也至少大于一行的数据,至少为16个。

具体

首先获取要取的序号,定义一个字符串,将之写入其中。

char str[];
sprintf(str,"[%d]",n);

接着,按串读取fp,与之相比较。

    FILE *fp=fopen("map.txt","rb");  //打开文本文件
if(fp==NULL)
return;
char data[];
fscanf(fp,"%s",data);//先读入一个串
while(strncmp(str,data,strlen(str))!=)//相等返回0
{
if(fscanf(fp,"%s",data)==NULL)//循环读取,游标也在移动
break;
}

假如读取到[10],符合题意了,则游标就正停留在[10]的后面,下面就是[10]序号下的14*16的数据。这个地方还有一个用处,比如说,一共有40关,假如玩家通关了,再扫描文件肯定找不到[41]的序号,就可以判定玩家通关了。

因为要读取14*16,相当于二维数组,处理如下:

    for(int y=;y<;y++) //行
{
fscanf(fp,"%s",data);//读取一行
for(int x=;x<;x++)//列
{
map[y][x]=data[x]-'';//字符变整型,填充map[][],map[][]是一个整型的二维数组,所以需要转换
......
}
}

这样,问题就解决了。

完整的示例代码

void LoadMap(int n) //载入地图,主要负责填充map[][]的二维数组,map[][]是操纵画图的关键
{
char str[10];
sprintf(str,"[%d]",n);
FILE *fp=fopen("map.txt","rb"); //打开文件,读取地图数据,所谓地图,就是用数字来(标示)操纵位图块
if(fp==NULL)
return;
char data[20];
fscanf(fp,"%s",data);//先读入一个串
while(strncmp(str,data,strlen(str))!=0)//相等返回0
{
if(fscanf(fp,"%s",data)==NULL)//循环读取,游标也在移动
break;
}
for(int y=0;y<14;y++) //行
{
fscanf(fp,"%s",data);//读取14行
for(int x=0;x<16;x++)//列
{
map[y][x]=data[x]-'0';//字符变整型,填充map[][]
if(map[y][x]==MANATROAD||map[y][x]==MANATDESTINATION)
{
manposition.x=x;//人的位置
manposition.y=y;
}
}
}
fclose(fp);
}

*注:这段程序,每次都要扫描整个文件,获取与序号相同的串,由于文件比较小,影响也不是太大。

总结:对一个文本文件的搜索过程。

scanf和fscanf读取文件的更多相关文章

  1. C++/Php/Python/Shell 程序按行读取文件或者控制台

    写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> i ...

  2. C语言 读取文件中特定数据

    //读取文件数据 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct jia ...

  3. Linux C 单链表 读取文件 并排序 实例并解释

    C的指针挺头疼的,先看一个例子: 给指针赋值和通过指针进行赋值这两种操作的差别确实让人费解.谨记区分的重要方法是:如果对左操作数进行解引用,则修改的是指针所指对象的值:    如果没有使用解引用操作, ...

  4. C读取文件

    C读取文件,这种写法不会多一行. #include "stdafx.h" #include <vector> using namespace std; struct P ...

  5. Loadrunner 读取文件

    char buffer[1000]; long file_stream; char * filename = "d:\log.txt"; file_stream=fopen(fil ...

  6. 【C】一个读取文件记录器

    分享一下!!! #include<stdio.h> #include<windows.h> #define N 70000 //定义行数!!用空间换取时间 struct stu ...

  7. Python读取文件数据

    1题目要求: 文本文件有这些数据,需要的只有其中的5个属性,如下颜色标记 像以下的数据达到75万组: 1product/productId: B0000UIXZ4 2product/title: Ti ...

  8. 73.fseek与宽字符读取文件

    fseek //文件路径 ] = "1.txt"; //FILE *pf = fopen(path, "a+");//尾部添加,文件指针在尾部 //FILE * ...

  9. C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。

    C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...

随机推荐

  1. tensorflow笔记之学习率设置

    在使用梯度下降最小化损失函数时,如果学习率过大会导致问题不能收敛到最优解,学习率过小,虽然可以收敛到最优解,但是需要的迭代次数会大大增加,在Tensorflow中,可以用指数衰减法设置学习率,tf.t ...

  2. lftp命令详解

    lftp.sh自动上传脚本: #!/bin/bash echo -e "\nScript start at \033[43;35m `date "+%H:%M:%S"` ...

  3. windows下多个文件合并成一个文件

    如果你拿到的是一堆文件,那么你想把它合并成一个文件来使用,那么按下面的步骤,轻轻松松就可以搞定. 第一步:把所有要合并的文件放到同一个文件下面 第二步:在CMD里面进入到你的文件目录 第三步:输入如下 ...

  4. 百度BAE的一些使用心得

    休眠会释放单元资源停止收费,那就不用被百度收费了

  5. Unity即将内置骨骼动画插件Anima2D

    Unity一直在寻找新的方法来帮助开发者,并为他们提供最好的工具.在此我们向大家宣布,Unity将内置流行的骨骼动画插件Anima2D,从2017年1月开始免费供所有Unity开发者使用! 同时也欢迎 ...

  6. [leetcode]295. Find Median from Data Stream数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  7. OpenStack概念架构简述

    什么是OpenStack OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云 ...

  8. MongoDB 3.0 Release Notes

    MongoDB 3.0支持WiredTiger存储引擎,提供可插拔存储引擎API,新增SCRAM-SHA-1认证机制,改进explain功能. 可插拔存储引擎API 允许第三方为MongoDB开发存储 ...

  9. 品味性能之道<二>:性能工程师可以具备的专业素养

          性能工程师可以具备的专业素养 程序语言原理,包括:C.C++.java及jvm.ASP,因为建站大部分外围应用和中间件都是JAVA编写,大部分的电商平台采用的ASP编写,底层核心系统是C/ ...

  10. Tomcat中的Web.xml和servlet.xml的学习

    Web.xml文件使用总结 作用: 存储项目相关的配置信息,保护servlet.解耦一些数据对程序的依赖 使用位置: 每个web项目中 Tomcat服务器中(在服务器目录conf目录中) 区别: We ...