首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件交错、文件扫描、文件打印

文件交错、文件扫描、文件打印
EN

Stack Overflow用户
提问于 2014-04-05 03:13:18
回答 3查看 686关注 0票数 2

编写一个从命令行接收三个参数的程序: week09_1文件1.txt文件2.txt文件3.txt

你的程序应该打开file1.txt和file2.txt文件进行读取和创建

file3.txt文件如下:

file3.txt的第一行是file1.txt的第一行

file3.txt的第二行是file2.txt的第一行

file3.txt的第三行是file1.txt的第二行

file3.txt的第四行是file2.txt的第二行

..。当一个输入文件到达EOF时,另一个文件中的其余行

应复制到输出文件中,然后程序终止。你的

如果文件名少于3个,程序应打印相应的错误消息

如果文件无法打开,请在命令行上提供。

因此,到目前为止,我已经能够完成提示符要求我做的事情;但是,当一个文件用完了要打印的行数,然后它只从另一个文件打印在同一行上时,我想知道如何才能让它在仅从一个文件打印时开始一个新行。

我也不明白我应该如何在命令行中实现提示符询问的方式。

代码语言:javascript
复制
#include <stdio.h>
char line1[256] = { };
char line2[256] = { };
char check;
int END = 0, END1 = 0, END2 = 0;

int main(int argc, char *argv[]) {
  if (argc != 4) {
    printf("Error: Wrong amount of arguments\n");
    return 0;
  }
  FILE *file1 = fopen("argv[1]", "r");
  FILE *file2 = fopen("argv[2]", "r");
  FILE *file3 = fopen("argv[3]", "w");
  if (argv == NULL) {
    printf("Error: file could not be opened.\n");
    return 0;
  }

  while (END != 2) {
    check = fgets(line1, 256, file1);
    if (check != NULL) {
      fprintf(file3, "%s", line1);
    } else if (check == NULL) {
      END1 = 1;
    }

    check = fgets(line2, 256, file2);
    if (check != NULL) {
      fprintf(file3, "%s", line2);
    } else if (check == NULL) {
      END2 = 1;
    }
    END = END1 + END2;
  }
  return 0;
}
EN

回答 3

Stack Overflow用户

发布于 2014-04-05 05:03:04

我会带你去那里的一段路。

假设此文件为file1.txt

代码语言:javascript
复制
File 1, Line 1
File 1, Line 2
File 1, Line 3
File 1, Line 4
File 1, Line 5
File 1, Line 6
File 1, Line 7
File 1, Line 8

并将此文件作为file2.txt

代码语言:javascript
复制
File 2, Line 1
File 2, Line 2
File 2, Line 3
File 2, Line 4
File 2, Line 5
File 2, Line 6
File 2, Line 7
File 2, Line 8
File 2, Line 9
File 2, Line 10

您可以阅读它们并将它们打印出来,如下所示:

代码语言:javascript
复制
#include <stdio.h>

int main(int argc, char *argv[]){
    char buffer[4096];
    char *ptr;
    int i=0;

    FILE *file1 = fopen("/tmp/file1.txt", "r");
    FILE *file2 = fopen("/tmp/file2.txt", "r");

    // while there is something from either file, do...
    while (!feof(file1) || !feof(file2)){
            // use modulo to switch file1, file2, etc
        if (i%2 == 0) {
            ptr=fgets(buffer, sizeof(buffer), file1);
        }   
        else {
            ptr=fgets(buffer, sizeof(buffer), file2);
        }
            // test if the last fgets actually read something by testing ptr vs NULL
        if (ptr)
            printf("%s", buffer);
        ++i;
    }   
    return 0;
}

打印:

代码语言:javascript
复制
File 1, Line 1
File 2, Line 1
File 1, Line 2
File 2, Line 2
File 1, Line 3
File 2, Line 3
File 1, Line 4
File 2, Line 4
File 1, Line 5
File 2, Line 5
File 1, Line 6
File 2, Line 6
File 1, Line 7
File 2, Line 7
File 1, Line 8
File 2, Line 8
File 2, Line 9
File 2, Line 10 

您需要将打印添加到file3,在文件上添加适当的fclose,读取argv,以及适当的错误测试/反应。

票数 1
EN

Stack Overflow用户

发布于 2014-04-05 06:45:51

我认为代码更容易管理,特别是如果文件中的最后一行没有换行符,如果你使用一个函数来处理一个文件的一行,并重复调用它。

代码语言:javascript
复制
#include <assert.h>
#include <stdio.h>
#include <string.h>

static int read_and_print_line(FILE *ifp, FILE *ofp)
{
  char buffer[64];
  int eol_needed = 0;
  while (fgets(buffer, sizeof(buffer), ifp) != 0)
  {
    fputs(buffer, ofp);
    if (strchr(buffer, '\n') != 0)
      return 0;
    /* Either more to read in current line or EOF without newline */
    eol_needed = 1;
  }
  if (eol_needed)
    putc('\n', ofp);
  return EOF;
}

int main(int argc, char **argv)
{
  if (argc != 4)
  {
    fprintf(stderr, "Usage: %s in-file1 in-file2 outfile\n", argv[0]);
    return 1;
  }
  FILE *if1 = fopen(argv[1], "r");
  FILE *if2 = fopen(argv[2], "r");
  FILE *ofp = fopen(argv[3], "w");
  if (if1 == 0)
    fprintf(stderr, "Failed to open %s for reading\n", argv[1]);
  if (if2 == 0)
    fprintf(stderr, "Failed to open %s for reading\n", argv[2]);
  if (ofp == 0)
    fprintf(stderr, "Failed to open %s for reading\n", argv[3]);
  if (if1 == 0 || if2 == 0 || ofp == 0)
    return 1;
  int r1 = 0;
  int r2 = 0;
  while ((r1 = read_and_print_line(if1, ofp)) != EOF &&
         (r2 = read_and_print_line(if2, ofp)) != EOF)
    ;

  assert(r1 == EOF || r2 == EOF);
  assert(r1 != r2);

  while (read_and_print_line(if1, ofp) != EOF)
    ;
  while (read_and_print_line(if2, ofp) != EOF)
    ;

  fclose(if1);
  fclose(if2);
  fclose(ofp);
  return 0;
}

我很满意,它可以在自己的源代码上工作,也可以在一个末尾没有换行符的‘行’文件上工作(echo -n Gobbledygook >file1),依此类推。缓冲区显示为64字节,以帮助测试(如果愿意,可以将其减少到32,甚至更低)。一旦经过测试,我就会使用4096这样的大小进行编译。

票数 1
EN

Stack Overflow用户

发布于 2014-04-05 06:41:54

一些UB代码需要修复

代码语言:javascript
复制
//char check;
void * check;

建议:

代码语言:javascript
复制
char line1[256] = { 0 };
char line2[256] = { 0 };

更改错误检查。可以扩展到哪个文件是坏的

代码语言:javascript
复制
if (file1 == NULL || file2 == NULL || file3 == NULL) {
  printf("Error: file could not be opened.\n");
  return 0;
}

但其他人有一个很好的“剩下的答案”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22871237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档