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

Я пытаюсь выяснить, почему я все еще получаю сообщение об ошибке, когда я выполняю свою команду gcc на терминале, и я также включил и код, и компилятор. Может кто-нибудь иметь представление, почему или может помочь мне для меня? Я действительно новичок в программе C в этом семестре. Это основная функция, которая принимает аргумент командной строки, который открывает два файла и объединяет два файла по одной строке за раз в один вывод. Первый файл представляет собой строки текста, но удаляет все пробелы в конце каждой строки (новые строки, символы табуляции и пробелы), а вторые файлы представляют собой список чисел. Таким образом, должно быть два столбца, разделенных символом. У меня есть они, например, так что вы можете визуально для большего уточнения:

  Example for to output:
  ./p2 test/p2-testa test/p2-testb
  Test A  11
  Test B  51
  Test C  91
  Test D  26
  Test E  17
  Test F  76


/* 3 point */
#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) && (fp2));    
  return (0);

}

СООБЩЕНИЕ ОБ ОШИБКЕ (КСТАТИ: Для лекции я использовал labcheck инструктором):

p2:
p2.c: In function ‘main’:
p2.c:52:19: warning: passing argument 1 of ‘fclose’ makes pointer from integer without a cast [-Wint-conversion]
       fclose((fp) && (fp2));
              ~~~~~^~~~~~~~
In file included from p2.c:2:
/usr/include/stdio.h:199:26: note: expected ‘FILE *’ {aka ‘struct _IO_FILE *’} but argument is of type ‘int’
 extern int fclose (FILE *__stream);
                    ~~~~~~^~~~~~~~
-3.0 output of program (p2) is not correct for input '/u1/h7/CS151/.check/text/list.1 /u1/h7/CS151/.check/nums/tiny.1':
------ Yours: ------
---- Reference: ----
Line A  6
Line B  41
Line C  52
Line D  3
Line E  36
Line F  61
--------------------

Я не совсем понял предупреждение и ожидаемое сообщение в C-программе.

Ответы [ 2 ]

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);

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

Выражение (fp) && (fp2), переданное fclose, объединяет два указателя с помощью оператора &&, который ожидает целочисленные операнды и интерпретирует их как ==0 или !=0. Результатом является целочисленное значение, которое опять-таки равно либо ==0, либо !=0, но оно больше не имеет ничего общего с ожидаемыми указателями fclose.

То есть fclose((fp) && (fp2)) должно быть

fclose(fp);
fclose(fp2);
...