文件逆顺输出到新文件(三种方案)

方法一:利用递归

/*功能:文件以行为单位,逆顺输出到新文件示例:file1.txt为:123456要求逆顺后输出到文件file2.txt,结果为:563412*/#include <stdio.h>
#include <string.h>// 递归读取文件
void doread(FILE *fp1, FILE *fp2, int next)
{char buf[1024] = {0};if(next && fgets(buf, 1024, fp1) != NULL)doread(fp1, fp2, next);else if(next)next = 0;						// 读到文件尾fwrite(buf, strlen(buf), 1, fp2);	// 写入新文件
}int run(char *infile, char *outfile)
{FILE *fp1 = NULL, *fp2 = NULL;if( NULL == (fp1 = fopen(infile, "r")) || NULL == (fp2 = fopen(outfile, "w")) )return 0;doread(fp1, fp2, 1);fclose(fp1);fclose(fp2);return 1;
}int main()
{char infile[] = "file1.txt";char outfile[] = "file2.txt";run(infile, outfile);return 0;
}


====================================================================================

方法二:利用链表(头插入法)

考虑到逆序的思想就是后进先出,这与的功能非常相似,于是产生了下面这种解法:

/*功能:演示了将文件中的内容以行为单位,逆顺输出到另一文件思路:考虑到后进先出,采用类似于栈的思想
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>typedef struct _tagNode
{char *line;struct _tagNode *next;
}Node;Node* insert(Node *head, char *line)			// 头插法建立链表
{Node *p = malloc(sizeof(Node));p->line = malloc(strlen(line)+1);strcpy(p->line, line);p->next = head;head = p;return head;
}void display(Node *head)
{int i = 0;while(head){printf("L%d: [%s]\n", ++i, head->line);head = head->next;}
}// 将文件中的内容以行为单位逆顺输出到另一文件
void reverse(FILE *fp1, FILE *fp2)
{int i = 0;char line[1024] = {0};Node *head = NULL, *t = NULL;// 读文件,建立链表while(fgets(line, 1024, fp1) != NULL)		// fgets默认会将换行符读入到line中{if(line[strlen(line)-1] == '\n')		// 最后一个是换行符line[strlen(line)-1] = 0;//printf("L%d: [%s]\n", ++i, line);head = insert(head, line);				// 头插法建立链表}
//	display(head);// 顺序读取链表,输出内容到文件,并释放结点while(head){fprintf(fp2, "%s\n", head->line);		// 将内容写入输出文件t = head;								// t指向要删除的结点head = head->next;						// head后移free(t->line);free(t);}
}int main()
{FILE *fp1, *fp2;char fin[] = "a.txt", fout[] = "a_out.txt";fp1 = fopen(fin, "r");fp2 = fopen(fout, "w");if(fp1 == NULL || fp2 == NULL){printf("Open file error\n");return 1;}reverse(fp1, fp2);							// 将文件中的内容以行为单位逆顺输出到另一文件fclose(fp1);fclose(fp2);return 0;
}

==================================================================================================

方法三:利用内存映射

/*功能:利用内存映射将文件中的内容以行为单位,逆顺输出到另一文件说明:如果最后一行无换行符,在输出文件中会被添加上去(否则会与第二行连在一起)
*/
#include <sys/mman.h>  /* for mmap and munmap */
#include <sys/types.h> /* for open */
#include <sys/stat.h>  /* for open */
#include <fcntl.h>     /* for open */
#include <unistd.h>    /* for lseek and write */
#include <stdio.h>// 以行为单位,将mapped_mem中的内容逆顺输出到文件fout
void reverse(char *mapped_mem, int flen, int fout)
{char *p, *t;t = p = mapped_mem + flen - 1;		// p指向内容的最后一个字节if(*p != '\n' && *p != '\0')		// 最后一个字节不是换行符或0t = p + 1;p--;while(p >= mapped_mem)				// 从末尾向前扫描{while(p >= mapped_mem && *p != '\n')p--;write(fout, p+1, t-p-1);		// 将[p+1, t)的内容输出到文件foutwrite(fout, "\n", 1);			// 输出换行符t = p--;}if(t == mapped_mem)					// 第一行是空行{write(fout, "\n", 1);}
}int main(int argc, char **argv)
{int fd, fd_out;char *mapped_mem = NULL;int flength = 1024;void * start_addr = 0;if(argc < 3){printf("Usage: %s <file_in> <file_out>\n", argv[0]);return 1;}fd = open(argv[1], O_RDONLY, S_IRUSR | S_IWUSR);fd_out = open(argv[2], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);if(fd == -1 || fd_out == -1){perror("open");return 1;}flength = lseek(fd, 0, SEEK_END);	// 求得文件长度mapped_mem = mmap(start_addr, flength, PROT_READ,	//允许读MAP_PRIVATE,		//不允许其它进程访问此内存区域fd, 0);if(mapped_mem == MAP_FAILED){perror("mmap");return 1;}reverse(mapped_mem, flength, fd_out);	// 逆顺输出文件内容到fd_outclose(fd);close(fd_out);munmap(mapped_mem, flength);return 0;
}


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

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

相关文章

js实现同时提交多个表单

http://www.jb51.net/article/17284.htm两种方法&#xff1a;1.使用ajax异步提交表单。方法简单&#xff0c;jQuery插件等都能实现。2.使用iframe。方法很原始&#xff0c;较麻烦。更多文章&#xff1a;实现同时提交多个form(基础方法) 收集-http://blog.csdn.net/elifefly/art…

海驾学车过程全揭秘——第九篇:科目三集训及考试

科目二考完之后就去约了科目三&#xff0c;当场定了6.1号&#xff0c;6.2号两天集训&#xff0c;6.2号下午考试。 6.1号&#xff0c;中午赶到驾校&#xff0c;在公告栏找到集训车&#xff0c;然后就找个凉快地方等着了。这时候科目二集训的几个同仁又聚到一起了&#xff0c;一个…

微信小程序知识点GET

1. app.json中的pages用来设置小程序包含哪些页面以及页面的路径、window用来设置默认页面的窗口表现形式、tabBar用来设置小程序底部tab的表现 2. app.js中的App()函数用来注册一个小程序&#xff0c;接受的对象参数用来指定小程序的生命周期函数等&#xff0c;注意App()必须…

CSS3 - 新单位vw、vh、vmin、vmax使用详解(附样例)

关于height:100%和height:100vh的区别 像 px、em 这样的长度单位大家肯定都很熟悉&#xff0c;前者为绝对单位&#xff0c;后者为相对单位。CSS3 又引入了新单位&#xff1a;vw、vh、vmin、vmax。下面对它们做个详细介绍。 一、基本说明 1&#xff0c;vw、vh、vmin、vmax 的…

删除两个双向链表中值相同的结点--无空白头结点

有两个双向链表&#xff0c;头指针为&#xff1a;pListA和pListB&#xff0c;要求删除这两个链表中值相同的结点, C语言实现&#xff0c;结点结构如下&#xff1a; struct node // 双向链表结点 {int key;struct node *front, *next; };完整源代码如下&#xff1a; /*功…

Enze Second day

哈喽&#xff0c;很高兴在云和学院又学了一天的新知识&#xff0c;现在&#xff0c;我来继续总结一下今天所学的以及对昨天的一些补充。 变量 • 声明变量的语法格式:–数据类型 变量名;•赋值: 变量名值;变量的命名 •命名规则&#xff1a;–1 必须以“字母”_或符号开头…

财务管理(Finance Management)

财务管理是指企业为实现良好的经济效益&#xff0c;在组织企业的财务活动、处理财务关系过程中所进行的科学预测、决策、计划、控制、协调、核算、分析和考核等一系列企业经济活动过程中管理工作的全称&#xff0c;其主要特点是对企业生产和再生产过程中的价值运动进行的管理&a…

微信小程序组件知识点GET

1. 可滚动视图区域组件scroll-view 在滚动 scroll-view 时会阻止页面回弹&#xff0c;所以在 scroll-view 中滚动&#xff0c;是无法触发下拉刷新事件 onPullDownRefresh&#xff0c;所以如果一定要使用下拉刷新&#xff0c;请使用页面的滚动&#xff0c;而不是 scroll-view &…

搭建一台本地json服务器

1、全局安装json-server(此时不管在哪个目录下面都可以) 2、cd至当前的项目文件夹所在的位置&#xff0c;新建一个文件夹jsonserver 3、在当前目录下运行npm init 4、再次安装运行 npm install json-server --save 5、此时的目录结构 --jsonserver--node_moduies--package-loc…

删除两个双向链表中值相同的结点--带空白头结点

有两个双向链表&#xff0c;空白头结点为&#xff1a;ListA和ListB&#xff0c;要求删除这两个链表中关键字相同的结点, C语言实现&#xff0c;结点结构如下&#xff1a; view plainstruct node // 双向链表结点 { int key; struct …

寻求空间支持

寻求支持.NET Framework 3.5以及SQL Server的空间&#xff0c;最好有本地磁盘读写权限&#xff08;特定数据目录&#xff09;。

判断浏览器版本语句大全

<!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> <!--[if IE]> 所有的IE可识别 <![endif]--> <!--[if IE 5.0]> 只有IE5.0可以识别 <![endif]--> <!--[if IE 5]> 仅IE5.0与IE5.5可以识别 <![endif]--> <!--[…

微信小程序API~GET

框架提供丰富的微信原生API&#xff0c;可以方便的调起微信提供的能力&#xff0c;如获取用户信息&#xff0c;本地存储&#xff0c;支付功能等 1. wx.on 开头的 API 是监听某个事件发生的API接口&#xff0c;接受一个 CALLBACK 函数作为参数。当该事件触发时&#xff0c;会调…

如何用DOS命令批量删除文件?(_desktop.ini 或 thumbs.db)

如何用DOS命令批量删除文件&#xff1f;比如viking蠕虫病毒会在系统里产生大量的“_desktop.ini”文件&#xff0c;虽然杀毒后系统无问题了&#xff0c;但看着总归不爽。我们可使用DOS命令批量删除“_desktop.ini”。 点击“开始”→“运行”&#xff0c;输入&#xff1a;“CMD…

Vue CLI3 开启gzip压缩

gizp压缩是一种http请求优化方式&#xff0c;通过减少文件体积来提高加载速度。html、js、css文件甚至json数据都可以用它压缩&#xff0c;可以减小60%以上的体积。 webpack在打包时可以借助 compression webpack plugin 实现gzip压缩&#xff0c;首先需要安装该插件&#xff…

让Sql Server也能出现如VS一样的智能提示工具--资源更新

一个非常实用的小插件&#xff0c;适合Sql Server2005以上版本&#xff0c;免费、无须注册。下面的图片是效果&#xff1a; http://rzhh.com.cn/down/sqlassc.rar 刚刚资源出错了&#xff0c;现在已经更新了资源&#xff0c;请大家下载。 转载于:https://www.cnblogs.com/zhang…