zoukankan      html  css  js  c++  java
  • 同时实现打开两个文件的内容

    字面上很容易理解,两个文件的内容在同一个水平画面上。文件1占1-30列,然后中间20列用空格隔开,文件2占剩下的30列。

    下面我说下我的思路:

    比如说规定两篇文章水平的长度为80,文件1先输入1-30个字符(输够的话就用空格符来顶替),然后在用20个空格副隔开,接着再输入文件2的内容30个字符(输够的话也用空格补充),这样就完成了一行的输入。这么想就简单了,两个循环,先外循环输入一行,再内循环输入80个字符。行数是不确定的,因为不知道文件的内容(就算知道了计算也很麻烦),但是列数是确定的,就80,不多不少。那么怎么才算结束输入行退出呢?那就是两个文件的内容都输入完毕的时候。因为有可能文件1输入完毕,但是文件2还没有输完,也可能反过来。值得注意的是文件结束符EOF和换行符' ',因为这也是决定了什么时候用空格补充来补够字符数。

    下面给出我实现的代码:

     1 /* 同时打开两个文件 */
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 #define MAX    80
     6 
     7 void Readline(FILE *fp1, FILE *fp2);
     8 
     9 int main(void)
    10 {
    11     FILE    *f1, *f2;
    12     char     filename[256];
    13     
    14     printf("请输入文件1的名字:");
    15     scanf(" %s", filename);
    16 
    17     if ((f1 = fopen(filename, "r")) == NULL)
    18     {
    19         perror("cannot read");
    20         exit(1);
    21     }
    22 
    23     printf("请输入文件2的名字:");
    24     scanf(" %s", filename);
    25 
    26     if ((f2 = fopen(filename, "r")) == NULL)
    27     {
    28         perror("cannot read");
    29         exit(1);
    30     }
    31 
    32     Readline(f1, f2);    /* 分栏函数 */
    33 
    34     fclose(f1);
    35     fclose(f2);
    36     return 0;
    37 }
    38 
    39     
    40 
    41 
    42 void Readline(FILE *fp1, FILE *fp2)
    43 {
    44     int    count;    /* 用来表示列数 */
    45     char    ch1 ,ch2;
    46 
    47     ch1 = fgetc(fp1);
    48     ch2 = fgetc(fp2);
    49     while (1)
    50     {
    51         for (count = 1; count <= MAX; count++)        /* 每一列都显示,没有的就显示空格 */
    52         {
    53             if (count >= 1 && count <= 30)        /* 文件1所占的范围 */
    54             {
    55                 if ((ch1 == EOF) || (ch1 == '
    '))
    56                 {
    57                     fprintf(stdout, "%c", ' ');
    58                 }
    59                 else
    60                 {
    61                     fprintf(stdout, "%c", ch1);
    62                     ch1 = fgetc(fp1);
    63                 }
    64             }
    65             if (count > 30 && count <= 50)        /* 中间就用空格隔开两个文件的内容 */        
    66             {
    67                 fprintf(stdout, "%c", ' ');
    68             }
    69             
    70 
    71             if (count > 50 && count <= MAX)        /* 文件2所占的范围 */
    72             {
    73                 if ((ch2 == EOF) || (ch2 == '
    '))
    74                 {
    75                     fprintf(stdout, "%c", ' ');
    76                 }
    77                 else
    78                 {
    79                     fprintf(stdout, "%c", ch2);
    80                     ch2 = fgetc(fp2);
    81                 }
    82             }
    83 
    84         }
    85 
    86         if (ch1 == '
    ')        /* 如果ch1是换行符时,要是不获取下一个字符,则将会一直输出空格 */
    87             ch1 = fgetc(fp1);
    88         if (ch2 == '
    ')
    89             ch2 = fgetc(fp2);    /* ch2也是一样,两者不能合并在一起,因为这是独立的 */
    90 
    91         fprintf(stdout, "%c", '
    ');
    92         if ((ch1 == EOF) & (ch2 == EOF))    /* 退出条件 */
    93             break;
    94     }
    95 }
    View Code

    再用两个测试文件来打开,输出在终端,你也可以修改输出到文件中。下面给出结果:

    其实道理很简单,但一定要注意换行符的问题。我就试过每一行就吞了一个字母,那是因为换行获取一个字符时在下一次输出的时候又获取了字符,就覆盖了。只有在该换行的时候才能执行那个获取下一字符的表达式。

    可以改进的地方:这个程序只支持ascll码,要是汉字的话就会出现乱码,因为汉字好像是占两个字节的吧。还有,可以在程序的后面加一个计数,计算每一行共由多少个除空格以外的字符。

    本人新手,说错的地方望指出,谢谢。

  • 相关阅读:
    2017级面向对象程序设计 作业三
    2017级面向对象程序设计 作业二
    2017级面向对象程序设计 作业一
    寒假作业之总结
    寒假第三次作业
    寒假第二次作业 与电梯有关的代码问题
    我印象中最深刻的三位老师
    Alpha冲刺Day5
    Alpha冲刺Day4
    Alpha冲刺Day3
  • 原文地址:https://www.cnblogs.com/fusae-blog/p/4257723.html
Copyright © 2011-2022 走看看