scanf和fscanf读取文件
这篇是针对推箱子游戏而写的,某个时候在学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读取文件的更多相关文章
- C++/Php/Python/Shell 程序按行读取文件或者控制台
写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> i ...
- C语言 读取文件中特定数据
//读取文件数据 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct jia ...
- Linux C 单链表 读取文件 并排序 实例并解释
C的指针挺头疼的,先看一个例子: 给指针赋值和通过指针进行赋值这两种操作的差别确实让人费解.谨记区分的重要方法是:如果对左操作数进行解引用,则修改的是指针所指对象的值: 如果没有使用解引用操作, ...
- C读取文件
C读取文件,这种写法不会多一行. #include "stdafx.h" #include <vector> using namespace std; struct P ...
- Loadrunner 读取文件
char buffer[1000]; long file_stream; char * filename = "d:\log.txt"; file_stream=fopen(fil ...
- 【C】一个读取文件记录器
分享一下!!! #include<stdio.h> #include<windows.h> #define N 70000 //定义行数!!用空间换取时间 struct stu ...
- Python读取文件数据
1题目要求: 文本文件有这些数据,需要的只有其中的5个属性,如下颜色标记 像以下的数据达到75万组: 1product/productId: B0000UIXZ4 2product/title: Ti ...
- 73.fseek与宽字符读取文件
fseek //文件路径 ] = "1.txt"; //FILE *pf = fopen(path, "a+");//尾部添加,文件指针在尾部 //FILE * ...
- C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。
C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...
随机推荐
- Linux iptables 备忘
iptables主要通过存储在linux内核中的一个个表来控制IP包的.可以想象成excel表格.你可以自定义所需的iptables表.不过已经内置了三张队列表. filter 这是默认的表,包含了内 ...
- Mysql InnoDB 数据更新 锁表
一.数据表结构 1 2 3 4 5 6 7 8 9 10 CREATE TABLE `jx_attach` ( `attach_id` int(11) NOT NULL AUTO_INCREMEN ...
- Java8 lambda表达式语法 1
本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化.本文是该系列的第一篇, ...
- My Goal For SE
2016年2月份,我开始进入软件工程的学习.作为一名大三学生,我对于此项课程,希望我自己能够通过制定学习目标来学好它. 首先,当我们在执行软件开发的时候,我们应该明确每个人的负责模块,我们应该明确自己 ...
- eclipse使用MAVEN打包可执行的jar包
1.新建maven工程 注意勾选 随便填一下 建好之后工程目录如下 新建测试类与工具类,主类很简单 工具类也很简单,就是初始化了日志 maven依赖包也只有一个log4j的jar <depend ...
- SSH框架分模块开发
------------------siwuxie095 SSH 框架分模块开发 1.在 Spring 核心配置文件中配置多个内容,容易造成 配置混乱,不利于维护 「分模块开发主要针对 Spring ...
- python作业(第十一周)基于RabbitMQ rpc实现的主机管理
作业需求: 可以对指定机器异步的执行多个命令 例子: >>:run "df -h" --hosts 192.168.3.55 10.4.3.4 task id: 453 ...
- js strict 关键字
strict strict模式,JavaScript在设计之初,为了方便初学者学习,并不强制要求用var申明变量.这个设计错误带来了严重的后果:如果一个变量没有通过var申明就被使用,那么该变量就自动 ...
- centos一键安装lnmp成功后无法访问ip(解决办法)
自己搞了个服务器 (我的服务器网络类型是 专有网络)如下图点击 配置规则 进入到 进.出端口规则配置 点击添加安全组规则 如图所配置 添加完成后 就如下面所示 (配置完成后 通过ip就已经可以访问了 ...
- PAT 1077 互评成绩计算(20)(代码+思路)
1077 互评成绩计算(20 分) 在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一 ...