Два файла в одну строку вывода каждого в C-программе - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь создать основную функцию, которая принимает аргументы командной строки, которые позволяют этой программе открывать два файла (пути указаны в командной строке) и объединяет два файла по одной строке за раз в один вывод.Первый предоставленный файл - это строки текста.Удалите все пробелы, табуляцию и новые строки.Вторые файлы представляют собой список чисел, к каждому из которых необходимо добавить по одному при печати на выходе.Кроме того, два столбца должны быть разделены символом табуляции.

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

const int MAXLEN = 4096;
const int MAXLINES = 10;

int main(int argc, char *argv[]) {

  char buffer[MAXLEN];
  char buffer2[MAXLEN];
  FILE *fp = fopen(argv[1], "r");
  FILE *fp2 = fopen(argv[2], "r");

  if (!fp || !fp2) {
    perror ("Not Found");
    exit (EXIT_FAILURE);
  }

  int n = 0;
  while((n < MAXLINES) && (fgets (buffer, sizeof (buffer), fp)) && (fgets(buffer2, sizeof (buffer2), fp2))) {
    printf("%s\t%s", buffer, buffer2);
    n++;    
    }
  }

  fclose(fp);
  fclose(fp2);

  return 0;
}

Например, для ввода и вывода:

./c2 test/c2-testa test/c2-testb

  Test A  11
  Test B  51
  Test C  91
  Test D  26
  Test E  17
  Test F  76

Это то, что я получил после команды gcc:

c2:
c2.c:53:7: warning: data definition has no type or storage class
       fclose(fp);
       ^~~~~~
c2.c:53:7: warning: type defaults to ‘int’ in declaration of ‘fclose’ [-Wimplicit-int]
c2.c:53:7: warning: parameter names (without types) in function declaration
c2.c:54:7: warning: data definition has no type or storage class
       fclose(fc2);
       ^~~~~~
c2.c:54:7: warning: type defaults to ‘int’ in declaration of ‘fclose’ [-Wimplicit-int]
c2.c:54:7: warning: parameter names (without types) in function declaration
c2.c:56:7: error: expected identifier or ‘(’ before ‘return’
       return 0;
       ^~~~~~
c2.c:58:7: error: expected identifier or ‘(’ before ‘}’ token
       }
       ^
make: *** [Makefile:31: c2.o] Error 1

1 Ответ

0 голосов
/ 15 ноября 2018

То, что вы сделали, это распечатали все строки из 2-го файла для каждой строки первого файла (вложенный цикл).Ваш цикл должен выглядеть следующим образом:

  int n = 0;
  while((n < MAXLINES) && (fgets (buffer, sizeof (buffer), fp)) && (fgets(buffer2, sizeof (buffer2), fp2))) {
    printf("%s\t%s", buffer, buffer2);
    n++;    
  }

Обратите внимание, что это не заботится о «удалении пробелов».Возможно, вам придется сделать дополнительную обработку для этого.

Кроме того, ваше состояние после открытия файлов должно быть if(!fp || !fp2), чтобы обеспечить возможность открытия обоих файлов !!

...