读取文件以行为单位逆序输出到另一文件

原创 2013年12月04日 16:26:56

首先要声明的一点时,一篇文档只是提供了一种思路或解决办法,不一定是最有效或最通用的,这里仅仅是期望会对他人有些借鉴的意义。

先来说明问题:从A文件读取文本内容,要求以逆序的方式写入到B文件中,逆序以行为单位。如

A.txt文件的内容为:

12
23
44
ff

最后输出到B.txt中的内容为:

ff
44
23
12

整个问题说起来实在是不难,如果是C++或者Java,使用Vector非常容易实现相关功能。难的是如何占用最少的资源,不把所有文件内容缓存能不能完成要求?

其实这个问题要考虑两个方面:1、文件大小;2、系统资源是否充足

如果系统文件不大,那么完全可以缓存整个文件内容;如果系统文件较大或者系统资源不宽裕的情况,那就要考虑采用别的方法了。

如果不缓冲文本内容,可以考虑这种思路:首先seek到A的文件末尾,然后向前搜索回车符"\n",搜索到后从"\n"的下一位置读取一行文本,这里可能需要保存当前读取行内容的位置,一直向前搜索"\n"读取一行,直到当前位置到文件的起始位置0.

如果缓冲文本,相对来说较为简单,C语言中可以使用链表完成文本内容的缓存,下面为一段示例代码可以作为参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1024
struct node{
    char *line;
    struct node *next;
};

int main(int argc, char **argv){
    struct node *head = (struct node*)malloc(sizeof(struct node));
    FILE *in, *out;
    char buf[MAXSIZE];

    if(argc < 2){
        printf("Please append the filename\n");
        return 0;
    }
    
    if(NULL == (in = fopen(argv[1], "r"))){
        printf("Error while open %s\n", argv[1]);
        return -1;
    }

    if(NULL == (out = fopen("result.txt", "w"))){
        printf("Error while open result.txt\n");
        close(in);
        return -1;
    }

    head->next = NULL;
    while(NULL != fgets(buf, MAXSIZE, in)){
        struct node *pnode = (struct node*)malloc(sizeof(struct node));
        pnode->line = (char*)malloc(strlen(buf));
        pnode->next = NULL;

        sprintf(pnode->line, "%s", buf);
        if(NULL != head->next){
            pnode->next = head->next;
            head->next = pnode;
        }else{
            head->next = pnode;
        }
    }

    while(NULL != head->next){
        struct node *pnode = head->next;
        fputs(pnode->line, out);
        head->next = pnode->next;
        free(pnode->line);
        free(pnode);
    }                                                                 
    free(head);
    fclose(out);
    fclose(in);
    return 0;
}   




 

 

c语言实现倒序输出

  • 2013年09月12日 20:29
  • 156KB
  • 下载

深度学习小白——Tensorflow(三) 读取数据

一个典型的文件读取管线会包含下面这些步骤: 文件名列表可配置的 文件名乱序(shuffling)可配置的 最大训练迭代数(epoch limit)文件名队列针对输入文件格式的阅读器纪录解析器可配置...
  • MargretWG
  • MargretWG
  • 2017年04月16日 15:43
  • 3170

C语言之文件操作02——输出文本文件中的内容显示在屏幕上

//文本文件的输出 /* =============================================================== 题目:输出文本文件中的内容显示在屏幕上! ==...
  • LZX19901012
  • LZX19901012
  • 2015年08月05日 02:48
  • 1671

读取文件 然后逆序输出

  • qiaoqinqie
  • qiaoqinqie
  • 2009年08月20日 13:08
  • 1018

Shell 从日志文件中选择时间段内的日志输出到另一个文件

Shell 从日志文件中选择时间段内的日志输出到另一个文件情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便。所以,相关人员希望能够查询某个时间段...
  • FungLeo
  • FungLeo
  • 2017年08月02日 10:13
  • 1730

Linux把一个文件标准输出输入到另一个文件中

“>”重定向覆盖原来的文件;“>>”追加到文件的末尾。 1、重定向标准输出,可以使用“>”符号,举例:    dir my_dir > filelisting.txt  将把 dir 命令的标准...
  • ying_593254979
  • ying_593254979
  • 2013年12月30日 11:01
  • 4963

经典面试题目——250M内存处理10G大小的log文件

前言 周末逛知乎的时候,看到的一个经典面试题目:http://www.zhihu.com/question/26435483,很经典的一道分而治之的题目。题目描述如下: 有次面试遇到一个问题,10G的...
  • zinss26914
  • zinss26914
  • 2014年11月03日 14:35
  • 2876

读取当前路径下的.C文件,然后逆序输出文件名

#include "stdio.h" #include "string.h" #include "stdlib.h" #include "windows.h" typedef struct { u...
  • yangluoning
  • yangluoning
  • 2013年10月18日 16:05
  • 1311

逆序输出文件(根据行号索引该行内容)源码

  • 2016年08月03日 20:08
  • 54.46MB
  • 下载

内存映射处理大文件并实现逆序输出

上一篇介绍了一种常见的文件处理方法(可优化为:分次读取文件,但要满足根据行号能快速索引该行内容时会遇到麻烦),所以此片我将介绍另一种更高效,实用,并对本进程的内存空间地址消耗小的方法! 一....
  • u012158162
  • u012158162
  • 2016年08月05日 21:21
  • 263
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读取文件以行为单位逆序输出到另一文件
举报原因:
原因补充:

(最多只允许输入30个字)