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

原创 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;
}   




 

 

相关文章推荐

读取文件 然后逆序输出

RandomAccessFile实现倒序输出文件的内容

因为之前碰到了一道题目:  编写一个Java应用程序,利用RandomAccessFile类,把几个int型整数(1,2,3,4,5,6,7,8,9,10)写入到一个名字为tom.dat文件中,然后...

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

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

Python文件操作:从文本末尾逆序读取数据

class TraceManagerBase(object): dblocation = "" def __init__(self): self.init() ...

C语言实现文件按行倒序存储

从A文件读取文本存储到B文件里,但是B文件里的文本顺序要和A文件里的顺序相反,比如A文件里的文本是: sun moon 那么B文件里的内容就必须是: moon sun 采用了双向链表实现这一功能,C语...

Linux怎样将文本行倒序排列

Linux怎样将文本行倒序排列   1. 命令方法:  nl filename | sort -nr | cut -f2 这个方法很unix风格,使用多命令组合完成某种功能是典型的unix特点...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

文件按行逆序的简单实现

前两天被同学问到一个简单的问题,将一个文本文件中的内容按行倒转过来,每行的内容不变。自己试了好一会,才发现C的FILE的那些操作都忘得差不多了。。。 一开始是准备创建一个新文件,读一行就往新文件里写...

C语言实现文件按行倒序存储

从A文件读取文本存储到B文件里,但是B文件里的文本顺序要和A文件里的顺序相反,比如A文件里的文本是: sun moon 那么B文件里的内容就必须是: moon sun 采用了双向链表实现这一功能,C语...

学习了LINUX下用C语言遍历文件夹,一些心得

Linux下C语言遍历文件夹[转] 2010-11-26 16:08:03|  分类: linux |  标签: |字号大中小 订阅 学习了LINUX下用C语言遍历文件夹,一些...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读取文件以行为单位逆序输出到另一文件
举报原因:
原因补充:

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