文件比较

1、按行将文本文件内容打印到屏幕

任务描述:

  • 按行读取文本文件内容并输出到新的文件中
  • 命令行中以文件名做输入参数

相关知识:

  • FILE *fopen(const char *path, const char *mode):打开一个文件,返回指向FILE结构体的指针
  • ssize_t getline(char **lineptr, size_t *n, FILE *stream):从文件流中读取一行字符串,并将字符串的地址存储到lineptr指向的指针中。返回的字符串以空字符’\0’结尾,同时包含换行符。参数n表示一次最多能读的字符数。

   如果在调用getline之前,设置了*lineptr为NULL,*n被设置为0,那么getline将会分配一个缓冲区来存储读取的一行字符串。则会个缓冲区应当由用户程序进行释放。释放时通过调用free函数进行。

main.c:

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
    FILE *fp;
    char *line=NULL;
    size_t len=0;
    ssize_t read;
    if(argc!=2){
        perror("argc error\n");
        exit(1);
    }
    fp=fopen(argv[1],"r");
    if(fp==NULL){
        perror("fopen error\n");
        exit(EXIT_FAILURE);
    }
    while((read=getline(&line,&len,fp))!=-1)
        printf("%s",line);
    free(line);
    fclose(fp);

    return 0;
}

2、字符串数组练习

任务描述:

  • 使用二维数组创建字符串数组,把输入的多个字符串存储到字符串数组中,最后打印输出字符串数组

相关知识:

  • 字母表顺序

   按照字母ASCII码的大小进行的排序。从左到右依次比较每个位置上字母的ASCII码大小。如果有不同的字母,则可以确定两个字符串的顺序。如果一个字符串是另一个字符串的子集,则长度较短的字符串排在长度较长的字符串的前面。26个英文字母的ASCII码从小到大依次增长。

   比如:“a” < “b”, “abca” < “abdd”, “abc” < “abcd”

main.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 20

int main(void)
{
    char str[N][N];int a,i;
    printf("please input your string number\n");
    scanf("%d\n",&a);
    for(i=0;i<a;i++)
        scanf("%s",str[i]);
    printf("your input string is \n");
    for(i=0;i<a;i++)
        printf("%s\n",str[i]);

    return 0;
}

3、字符串数组

任务描述:

  • 从键盘输入多个字符串,使用malloc函数创建字符串数组,把输入的多个字符串存储到字符串数组中,最后打印输出字符串数组

相关知识:

  • void *malloc(size_t size):分配了size个字节,并返回了指向这块内存的指针
  • 指向指针的指针

   如果一个指针变量的类型是“指向指针的指针”,那么这个指针变量对应的内存中存储的是一个指针值,这个指针值指向的内存中存储的也是一个指针。

   比如:char ** lines = (char **)malloc(3*sizeof(char*)).那么在内存里面lines的表示为:

    

   用malloc分配一个内存空间,包含3个指向字符的指针,返回一个指向内存空间首地址的指针lines,该指针类型就是指向指针的指针

  • void free(void *ptr):释放ptr指向的存储空间

   被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配。使用malloc分配的内存,需要自己调用free函数进行内存释放,否则,会造成内存泄漏的情况。

main.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define SIZE 20

int main(void)
{
    char **strArray=NULL;
    char buf[SIZE];
    int i,strNum;
    printf("please input number\n");
    scanf("%d",&strNum);
    strArray=(char **)malloc(strNum*sizeof(char *));
    for(i=0;i<strNum;i++){
        strArray[i]=(char *)malloc(SIZE*sizeof(char));
        memset(buf,‘\0‘,sizeof(buf));
        scanf("%s",buf);
        strcpy(strArray[i],buf);
    }
    printf("your input string is\n");
    for(i=0;i<strNum;i++){
        printf("%s\n",strArray[i]);
        free(strArray[i]);
    }
    free(strArray);

    return 0;
}

4、使用qsort库函数对整数数组由小到大进行排序

任务描述:

  • 由终端输入n行,每行包含一个整数。对这n个整数进行由小到大的排序,然后输出排序后的整数

相关知识:

  • void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *)):

    参数:

    base: 待排序数组首地址

    nelem:数组中待排序元素数量

    width:数组元素的大小

    fcmp: 函数指针,用于比较数组中两个元素的大小,确定两个元素的先后顺序。这个函数需要自己定义,qsort在执行的过程中,会调用这个函数,来比较两个元素的大小,据此,确定两个元素的先后顺序

main.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50

int sort_function( const void *a, const void *b);

int main(void)
{
    int a,i,n;int num[N];
    printf("please input number\n");
    scanf("%d",&a);
    printf("before sorting the number is:\n");
    for(i=0;i<a;i++)
        scanf("%d",&num[i]);
    //n=strlen(num);
    for(i+0;i<a;i++)
        printf("%d\n",num[i]);
    qsort((void *)num,a,sizeof(int),sort_function);
    printf("after sorting the number is:\n");
    for(i=0;i<a;i++)
        printf("%d\n",num[i]);

    return 0;
}

int sort_function( const void *a, const void *b)
{
    return(*(int*)a-*(int*)b);
}

5、对文本文件各行字符串排序并打印

任务描述:

  • 对一个文本文件的各行字符串按照字母表顺序进行排序,并打印输出排序后的各行字符串
  • 命令行中以文本文件名做输入参数,打印各行排序后的结果

main.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50

int sort_function(const void *a, const void *b);

int main(int argc,char *argv[])
{
    FILE *fp;
    char *line=NULL;
    size_t len=0;
    ssize_t read;
    char buf[N][N];
    int i=0,a=0,b=0;
    if(argc!=2){
        perror("argc error\n");
        exit(1);
    }
    fp=fopen(argv[1],"r");
    if(fp==NULL){
        perror("argv error\n");
        exit(1);
    }
    printf("before sorting the string is:\n");
    while((read=getline(&line,&len,fp))!=-1){
        strcpy(buf[i],line);
        printf("%s",line);
        i++;
    }
    qsort(buf,i,sizeof(buf[0]),sort_function);
    printf("after sorting the string is:\n");
    for(a=0;a<i;a++)
        printf("%s",buf[a]);
    free(line);

    return 0;
}

int sort_function(const void *a, const void *b)
{
    char *str1 = (char *)a;
    char *str2 = (char *)b;
    return strcmp(str1,str2);
}

6、删除文本文件重复的行,并将结果保存到新的文件中

任务描述:

  • 对重复的行只保留,新文件中的文本行按照字母表顺序排列,保持原文件内容不变
  • 命令行以原文件名和文件名做参数,结果保存在新文件中。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50

int sort_function(const void *a, const void *b);

int main(int argc,char *argv[])
{
    FILE *fp1,*fp2;
    char *line=NULL;
    size_t len=0;
    ssize_t read;
    char buf[N][N];
    int i=0,a=0,b=0;
    if(argc!=3){
        perror("argc error\n");
        exit(1);
    }
    fp1=fopen(argv[1],"r");
    if(fp1==NULL){
        perror("argv1 error\n");
        exit(1);
    }
    fp2=fopen(argv[2],"w");
    if(fp2==NULL){
        perror("argv2 error\n");
        exit(1);
    }

    while((read=getline(&line,&len,fp1))!=-1){
        strcpy(buf[i],line);
        i++;
    }
    fwrite(buf[0],1,strlen(buf[0]),fp2);
   //a=i;
    for(a=1;a<i;a++){
        if(strcmp(buf[a],buf[a-1])==0)
            continue;
        else
            fwrite(buf[a],1,strlen(buf[a]),fp2);
    }
    free(line);

    return 0;
}

7、求两个已按字母表顺序排好序且没有重复行的文本文件的并集

任务描述:

  • 求两个已按字母表顺序排好序且没有重复行的文本文件的并集,并将结果写入到新文件中
  • 新文件也要求是按字母表顺序排好序的,且没有重复行的

相关知识:

  什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。

  举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。

  注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是adf。LCS可以使用动态规划法解决。下文具体描述。事实上,最长公共子序列问题也有最优子结构性质,可以考虑用动态规划算法来计算。用c[i,j]记录序列Xi和Yj的最长公共子序列的长度。其中Xi=<x1, x2, …, xi>,Yj=<y1, y2, …, yj>。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列,故c[i,j]=0。其他情况下,由定理可建立递归关系如下:

计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y)以序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>作为输入。输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储Xi与Yj的最长公共子序列的长度,b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到的,这在构造最长公共子序列时要用到。最后,X和Y的最长公共子序列的长度记录于c[m,n]中。

Procedure LCS(b,X,i,j);  
begin  
  if i=0 or j=0 then return;  
  if b[i,j]="" then  
    begin  
      LCS(b,X,i-1,j-1);  
      print(x[i]); {打印x[i]}  
    end  
  else if b[i,j]="↑" then LCS(b,X,i-1,j)   
                      else LCS(b,X,i,j-1);  
end;   

在算法LCS中,每一次的递归调用使i或j减1,因此算法的计算时间为O(m+n)。例如,设所给的两个序列为X=<A,B,C,B,D,A,B>和Y=<B,D,C,A,B,A>。由算法LCS_LENGTH和LCS计算出的结果如下图所示:

main.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50
int sort_function( const void *a, const void *b);
int main(int argc,char *argv[])
{
    FILE *fp1,*fp2,*fp3;
    char *line1=NULL,*line2=NULL;
    size_t len1=0,len2=0;   ssize_t read;
    int i=0,cmprel,num1,num2;
    if(argc!=3){
        perror("argc error\n");
        exit(1);
    }
    fp1=fopen(argv[1],"r");
    if(fp1==NULL){
        perror("argv1 error\n");
        exit(1);
    }
    fp2=fopen(argv[2],"r");
    if(fp2==NULL){
        perror("argv2 error\n");
        exit(1);
    }
    fp3=fopen("bingji","w");
    if(fp3==NULL){
        perror("argv3 error\n");
        exit(1);
    }
    num1=getline(&line1,&len1,fp1);
    num2=getline(&line2,&len2,fp2);
    while(num1!=-1&&num2!=-1){
        cmprel=strcmp(line1,line2);
        if(cmprel<0){
            fwrite(line1,1,strlen(line1),fp3);
            num1=getline(&line1,&len1,fp1);
        }
        else if(cmprel>0){
            fwrite(line2,1,strlen(line2),fp3);
            num2=getline(&line2,&len2,fp2);
        }else{
            fwrite(line1,1,strlen(line1),fp3);
            num1=getline(&line1,&len1,fp1);
            num2=getline(&line2,&len2,fp2);
        }
    }
    while(num1!=-1){
        fwrite(line1,1,strlen(line1),fp3);
        num1=getline(&line1,&len1,fp1);
    }
    while(num2!=-1){
        fwrite(line2,1,strlen(line2),fp3);
        num2=getline(&line2,&len2,fp2);
    }
    free(line1);free(line2);
    fclose(fp1);fclose(fp2);fclose(fp3);

    return 0;
}

8、求两个已按字母表顺序排好序且没有重复行的文本文件的交集

任务描述:

  • 求两个已按字母表顺序排好序且没有重复行的文本文件的交集,并将结果写入到新文件中
  • 新文件也要求是按字母表顺序排好序的,且没有重复行的

相关知识:

  • 使用getline函数读取文本文件中的文本行
  • 使用malloc函数分配内存空间存储文本文件中的内容
  • 先利用最长公共子序列算法来求出两个文本文件的最长公共子序列。其中最长公共子序列中的每个元素都是文本文件中的一行文本
  • 这个最长公共子序列就是两个文件的交集

main.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50
int sort_function( const void *a, const void *b);
int main(int argc,char *argv[])
{
    FILE *fp1,*fp2,*fp3;
    char *line1=NULL,*line2=NULL;
    size_t len1=0,len2=0;   ssize_t read;
    int i=0,cmprel,num1,num2;
    if(argc!=3){
        perror("argc error\n");
        exit(1);
    }
    fp1=fopen(argv[1],"r");
    if(fp1==NULL){
        perror("argv1 error\n");
        exit(1);
    }
    fp2=fopen(argv[2],"r");
    if(fp2==NULL){
        perror("argv2 error\n");
        exit(1);
    }
    fp3=fopen("jiaoji","w");
    if(fp3==NULL){
        perror("argv3 error\n");
        exit(1);
    }
    num1=getline(&line1,&len1,fp1);
    num2=getline(&line2,&len2,fp2);
    while(num1!=-1&&num2!=-1){
        cmprel=strcmp(line1,line2);
        if(cmprel<0)
            num1=getline(&line1,&len1,fp1);
        else if(cmprel>0)
            num2=getline(&line2,&len2,fp2);
        else{
            fwrite(line1,1,strlen(line1),fp3);
            num1=getline(&line1,&len1,fp1);
            num2=getline(&line2,&len2,fp2);
        }
    }
    while(num1!=-1)
        num1=getline(&line1,&len1,fp1);
    while(num2!=-1)
        num2=getline(&line2,&len2,fp2);
    free(line1);free(line2);
    fclose(fp1);fclose(fp2);fclose(fp3);

    return 0;
}

9、

相关知识:

  • 使用getline函数读取文本文件中的文本行
  • 使用malloc函数分配内存空间存储文本文件中的内容
  • 先利用最长公共子序列算法来求出两个文本文件的最长公共子序列。其中最长公共子序列中的每个元素都是文本文件中的一行文本。
  • 这个最长公共子序列就是两个文件的交集。
  • 根据这个交集,从第二个文件中输出和交集中元素不同的文本行,从而就可以求出第二个文件与第一个文件的差集。

main.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50
int sort_function( const void *a, const void *b);
int main(int argc,char *argv[])
{
    FILE *fp1,*fp2,*fp3;
    char *line1=NULL,*line2=NULL;
    size_t len1=0,len2=0;   ssize_t read;
    int i=0,cmprel,num1,num2;
    if(argc!=3){
        perror("argc error\n");
        exit(1);
    }
    fp1=fopen(argv[1],"r");
    if(fp1==NULL){
        perror("argv1 error\n");
        exit(1);
    }
    fp2=fopen(argv[2],"r");
    if(fp2==NULL){
        perror("argv2 error\n");
        exit(1);
    }
    fp3=fopen("chaji","w");
    if(fp3==NULL){
        perror("argv3 error\n");
        exit(1);
    }
    num1=getline(&line1,&len1,fp1);
    num2=getline(&line2,&len2,fp2);
    while(num1!=-1&&num2!=-1){
        cmprel=strcmp(line1,line2);
        if(cmprel<0){
            fwrite(line1,1,strlen(line1),fp3);
            num1=getline(&line1,&len1,fp1);
        }else if(cmprel>0)
           num2=getline(&line2,&len2,fp2);
        else{
            num1=getline(&line1,&len1,fp1);
            num2=getline(&line2,&len2,fp2);
        }
    }
    while(num1!=-1){
        fwrite(line1,1,strlen(line1),fp3);
        num1=getline(&line1,&len1,fp1);
    }
    while(num2!=-1)
        num2=getline(&line2,&len2,fp2);
    free(line1);free(line2);
    fclose(fp1);fclose(fp2);fclose(fp3);

    return 0;
}
时间: 2024-10-12 16:56:22

文件比较的相关文章

最佳vim技巧

最佳vim技巧----------------------------------------# 信息来源----------------------------------------www.vim.org         : 官方站点comp.editors        : 新闻组http://www.newriders.com/books/opl/ebooks/0735710015.html : Vim书籍http://vimdoc.sourceforge.net/cgi-bin/vim

Mac下获取AppStore安装包文件路径

本文介绍了Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用的相关步骤,希望对大家有所帮助. 通过远在大洋彼岸的苹果服务器下载东西,确实有够慢啊!AppStore更甚:甚至都经常提示连不上服务器,而有些软件呢,还必须从AppStore下载安装,所以没办法,谁让上了苹果的贼船呢!公司的网速更是不敢恭维,以至于基本上不下东西,除非像这次一样:手贱的把iPhone6升级到8.2.2了,然后Xcode6.1.1真机调试不成了,所以需要下个Xcode6.2.昨天刚更新的Xcode

微信文件传输助手文件夹在哪?一起来找找

微信文件传输助手是微信电脑版与手机微信之间相互传输图片等文件的好工具,但很多童鞋都找不到微信文件传输助手文件夹在哪,就让我们一起找找吧 1.先说说手机微信文件传输助手文件夹在哪吧 文件夹路径为/Tencent/MicroMsg/Download/ 2.电脑版微信文件传输助手文件夹在:/微信安装保存目录/wechat files/微信号/ 也可以点击接收到的图片下载保存到相应位置即可

GitHub限制上传大于100M的单个大文件

工作中遇到这个问题,一些美术资源..unitypackage文件大于100M,Push到GitHub时被拒绝.意思是Push到GitHub的每个文件的大小都要求小于100M. 搜了一下,很多解决办法只是把这些超过100M的大文件从本地版本库中移除,使得Push可以成功.但这并没有解决如何上传大文件到GitHub的问题. 解决办法是使用Git LFS. 用法参考:http://blog.csdn.net/tyro_java/article/details/53440666 按照以上方法设置好后,就

Linux 将文件夹下的所有文件复制到另一个文件里

如何将文件夹/home/work下的文件复制到/home/temp里面? 使用命令: cp -R /home/work/* /home/temp *表示所有文件 但是/home/work 下的隐藏文件都不会被拷贝 更好的复制的方法是用"."代替"*"就好了. cp -R /home/work/.  /home/temp 将一个文件夹复制到另一个文件夹下,例如将/home下的work文件夹复制到temp下面 命令为: cp -R /home/work  /home/t

Maven中,pom.xml文件报错

一:错误消息,如下图: aus 原因是本地仓库在org.codehaus.plexus:plexus-uils:pom:3.0.20下面没有jar文件,只有一个plexus-utils-3.0.20.pom.lastUpdated,如下图: 解决:将该文件夹删掉,然后右击项目:Maven->Update Project就可以了 若pom.xml里面还有类型的报错,就像这样解决就OK了

java读文件

java.io.*; public abstract class Reader implements Readable,Closeable{}     public class BufferedReader extends Reader{         public BufferedReader(Reader in);创建一个使用默认大小输入缓冲区的缓冲字符输入流.         public BufferedReader(Reader in, int sz);创建一个使用指定大小输入缓冲区

PHP拷贝目录下的所有文件

//目录拷贝函数到任意目录function dir1($filename,$dest){ static $dirname; $dirname.=$dest; //连接头(第一层目录) static $dir; //中间变量 if(file_exists($filename)){ //如果文件存在 if(is_dir($filename)){ //如果是目录,则先创建目录然后遍历 $dirnames=basename($filename); //取最后的目录或者文件名,链接到要转移到的第一层目录

万家报账平台没有“上传文件”按钮的解决办法

在有的电脑没有"上传文件"的按钮? 第一步:首先检查浏览器设置. 第二步:找到IE的Internet选项菜单,开启菜单栏的根据下列方面找,如下图: 第三步:找到Internet选项后,点击,选择安全选项卡,并点击"自定义级别" 第四步:找到"将文件上载到服务器时包含本地目录路径"选择"启用".然后点击确定关闭IE,重启打开. 第五步:更新浏览器的flash版本.在百度中搜索"flash player官网"即

通过jQuery Ajax使用FormData对象上传文件

转自:http://www.cnblogs.com/labnizejuly/p/5588444.html FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". <form id="uploadForm" enctype="multipart/form-data"> <input id="file" type="file"