字体文件解析 c语言,如何正确地从C语言的文件中读取某些字符串?

您试图从文件中读取的内容并不简单,但可以通过设置一个标志来处理,该标志告诉您是否已经看到

'a'

'b'

,跳过所有空白和

':'

字符,将所有其他字符存储在缓冲区中,根据需要重新分配,然后在第二个

“A”

“B”

找到了,把那个角色放回

FILE*

流与

ungetc

,nul终止并返回缓冲区。

听起来很简单——对吧?好吧,差不多了。让我们看看你需要什么

readword()

功能。

首先,因为你分配给

buffer

在里面

Read Word()

,不需要通过

char **buffer

作为参数。你已经声明了

readword

作为

char *readword(...)

所以只要通过

文件*

将指针作为参数,并返回指向

NUL终止

缓冲器。

您可以按自己喜欢的任何方式处理重新分配方案,可以从分配的合理字符数开始,然后将当前大小加倍(或添加一些倍数),或者每次用完时添加一个固定的数量。下面的示例只是从一个32个字符的缓冲区开始,然后在每次需要重新分配时再添加32个字符。(如果数据大小真的未知,我可能会从32个字符开始,然后每次用完都加倍——完全取决于您)。

使用

isspace()

函数位于

ctype.h

确保正确处理所有空白。

最后几个问题只是确保您返回

NUL终止

缓冲区中的字符串,并确保在以下情况下重新初始化指向每个新内存块中缓冲区结尾的指针

realloc

被称为。

总而言之,你可以做一些类似的事情。在

Read Word()

函数读取示例文件并输出从文件中读取的组合字符串,

#include

#include

#include

#define NCHR 32

char *readword (FILE *fp)

{

int c, /* current character */

firstline = 0; /* flag for 'a' or 'b' found at 1st char */

size_t n = 0, nchr = NCHR; /* chars read, number of chars allocated */

char *buffer = NULL, *p; /* buffer to fill, pointer to buffer */

buffer = malloc (nchr); /* allocate initial NCHR */

if (!buffer) { /* validate */

perror ("malloc-buffer");

return NULL;

}

p = buffer; /* set pointer to buffer */

while ((c = fgetc (fp)) != EOF) { /* read each char */

if (isspace (c) || c == ':') /* skip all whitespace and ':' */

continue;

if (c == 'a' || c == 'b') { /* begins with 'a' or 'b' */

if (firstline) { /* already had a/b line */

ungetc (c, fp); /* put the char back */

*p = 0; /* nul-terminate */

return buffer; /* return filled buffer */

}

firstline = 1; /* set firstline flag */

continue;

}

else {

if (n == nchr - 2) { /* check if realloc needed */

void *tmp = realloc (buffer, nchr + NCHR);

if (!tmp) /* validate */

exit (EXIT_FAILURE);

buffer = tmp; /* assign new block to buffer */

p = buffer + n; /* set p at buffer end */

nchr += NCHR; /* update no. chars allocated */

}

*p++ = c; /* assign the current char and advance p */

n++; /* increment your character count */

}

}

*p = 0; /* nul-terminate */

return buffer;

}

int main (int argc, char **argv) {

char buf[NCHR], *word;

int nwords, toggle = 0;

/* use filename provided as 1st argument (stdin by default) */

FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

if (!fp) { /* validate file open for reading */

perror ("file open failed");

return 1;

}

if (!fgets (buf, NCHR, fp)) {

fputs ("error: read of line 1 failed.\n", stderr);

return 1;

}

if (sscanf (buf, "%d", &nwords) != 1) {

fputs ("error: invalid file format.\n", stderr);

return 1;

}

nwords *= 2; /* actual number of words is twice the number of pairs */

while (nwords-- && (word = readword (fp))) {

printf ("%c: %s\n", toggle ? 'b' : 'a', word);

free (word);

if (toggle) {

putchar ('\n');

toggle = 0;

}

else

toggle = 1;

}

if (fp != stdin) fclose (fp); /* close file if not stdin */

return 0;

}

(

音符:

在上面

toggle

仅仅是一个

1

0

用于输出的标志

"a:"

"b:"

在适当行的开头添加

'\n'

两行之间。)

示例使用/输出

$ ./bin/read_multiline_pairs dat/pairsbinline.txt

a: 010101000001010111110100101010000000111100000000000011110000

b: 0000011111000001000110101010100111110001

a: 0000001111111111110000111111111111000

b: 00000001111001010101

内存使用/错误检查

在动态分配存储空间时,请始终验证内存使用情况,并确保已释放所有分配的内存。

$ valgrind ./bin/read_multiline_pairs dat/pairsbinline.txt

==14257== Memcheck, a memory error detector

==14257== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.

==14257== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info

==14257== Command: ./bin/read_multiline_pairs dat/pairsbinline.txt

==14257==

a: 010101000001010111110100101010000000111100000000000011110000

b: 0000011111000001000110101010100111110001

a: 0000001111111111110000111111111111000

b: 00000001111001010101

==14257==

==14257== HEAP SUMMARY:

==14257== in use at exit: 0 bytes in 0 blocks

==14257== total heap usage: 8 allocs, 8 frees, 872 bytes allocated

==14257==

==14257== All heap blocks were freed -- no leaks are possible

==14257==

==14257== For counts of detected and suppressed errors, rerun with: -v

==14257== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

仔细看一下,如果有问题请告诉我。问题的最大部分是处理每对的所有行的读取和连接。剩下的代码就留给你了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何判断linux系统是32位还是64位的?

最简单的是输入命令:uname -m 查看输出,如果输出是i686这种ixxx系列的,都是32位系统,如果出现x86_64这样的,就是64位。

02 - 替换SetInput方法 VTK 6.0 迁移 (2013-06-30 16:22)

VTK6 引入了许多不兼容的变化,这其中就包括用SetInputData()和SetInputConnection()替换SetInput()方法。在先前的版本中,VTK4 引入了SetInput()方法,VTK5中引入了SetInputConnection()。 下面举一些例子:在如下例子中&#xff0c…

c语言中怎么 写子程序,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*************************************************************************************** 外部中断0实验 *实现现象:下载程序后按下K3按键可以对D1小灯状态取反。注意事项:无。***********************…

Java Web笔记之Struts2.1 +Hibernate3.3 +Spring3.0

2019独角兽企业重金招聘Python工程师标准>>> 1、Struts2 1.1、了解Struts2 Struts2是基于MVC设计模式的Java Web框架技术之一,按照MVC设计思想把Java Web应用程序分为: 控制器层,包括核心控制器FilterDispatcher和业务控制器Actio…

高地址和低地址、高字节与低字节、大小端模式的转换、存储顺序

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 一、高地址和低地址 二、高字节低字节 如int a16777220,化为十六进制是0x01 00 00 04,则04属于低字节,01属于高字节。 三、大小端模式 (1)如果a在内…

漫谈数据挖掘从入门到进阶

入门:数据挖掘入门的书籍,中文的大体有这些:Jiawei Han的《数据挖掘概念与技术》Ian H. Witten / Eibe Frank的《数据挖掘 实用机器学习技术》Tom Mitchell的《机器学习》TOBY SEGARAN的《集体智慧编程》Anand Rajaraman的《大数据》Pang-Nin…

C语言程序设计二期末考试,C语言程序设计期末考试试卷2.doc

C语言程序设计期末考试试卷2选择题(单选题,每小题2分,共15题,30分)注意:请将答案写在每小题的题号左边1.一个C程序由若干个C函数组成,各个函数在文件中的位置为_____A______。A) 任意B) 第一个函数必须是主…

(转)Asp.Net生命周期系列一

原文地址:http://www.cnblogs.com/skm-blog/archive/2013/07/07/3176713.html Asp.Net生命周期对于初级甚至中级程序员来说,一直都是一个难题,很多程序员不了解生命周期,导致使用Asp.Net做开发感觉很不灵活,感觉太多东…

c语言枚举法礼泡声次数,C语言枚举类型举例

C语言枚举类型举例注:以下全部代码的执行环境为VC 6.0宏和枚举的区别宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不存在了。而枚举是在程序运…

【IOS】集成zxing(二维码扫描)

现在zxing已经到了2.2版本,以前的集成方式出了点问题。下面我做出一点修正。以前的版本的集成方法,参考:http://blog.devtang.com/blog/2012/12/23/use-zxing-library/按照以前的方式做好后 然后就是适配以下现在的版本的修改1.增加 SenTe…

与TCP有关的面试内容

以下内容源于网络资料的学习与整理。 参考博客 TCP/IP四层模型 - BlueTzar - 博客园(OSI参考模型和TCP模型的详解,包括格式) TCP/IP协议-为什么说TCP是可靠连接_shuaixio的博客-CSDN博客(为什么可靠及优缺点) 两张动图…

登录后跳转到原页面

可以在点击登录页面时,进行url传值,比如从a.html到b.html,可以a.html?oldurlb.html 带有特殊符号、中文的可以加个encodeURIComponent()转载于:https://www.cnblogs.com/wuchao/p/3179350.html

c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...

#include#include#include#include#include#includevoid pause();typedef struct STUDENT{char studentNumber[20]; //学生学号char studentName[20]; //学生姓名char className[20]; //班级名称float chinese; //语文绩float maths; //数学成绩float english; //外语成绩float…

嵌入式面试中常见的编程题目

以下内容源于网络资料的学习整理,如有侵权,请告知删除。 目录 1、将字符串反转 2、数字翻转和回文判断 3、大小端问题 (1)判断大小端 (2)大小端转换 4、实现函数memcpy(), strcpy(), strcmp(), strc…

用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题

用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题 用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题 提示找不到表,我去看了一下,丢失了很多个表; 问题: 直接拷贝data下的数据库数据进行备份…

回旋矩形C语言,C语言回旋函数解释下,该如何处理

当前位置:我的异常网 C语言 C语言回旋函数解释下,该如何处理C语言回旋函数解释下,该如何处理www.myexceptions.net 网友分享于:2013-06-08 浏览:30次C语言回旋函数解释下给定两个整数M,N,生成一个M*N的矩阵,矩阵中元…

JUnit4概述

JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也就是说,这个东西在…

嵌入式面试中常见的问答题(线程进程、TCP等)

以下内容源于网络资料的学习整理,如有侵权,请告知删除。 一、线程、进程的区别联系 见https://blog.csdn.net/oqqHuTu12345678/article/details/72637318的表格 个人理解:进程相当于一个运行中的程序,线程相当于程序中的某些函数…

c语言读取文件到结构体数组,有关文件读写到结构体数组问题;

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼typedef struct IMG{char *name;int weight;int height;}IMG;这是我的结构体存的是 图片的名字 宽度 高度void readWeightHeight(void){FILE *fpbmp;//FILE *fpm;char filename[54];char *bmpname NULL;long Handle;int i 0;struc…