2015-10-13 2 views
-5

Итак, у меня есть этот проект, где мне нужно открыть файл и распечатать содержимое на C, но я должен использовать системные вызовы unix. Однако я не могу понять, почему ничего не печатает. Я пытаюсь запустить код, но он, кажется, пропустит прямо к ошибке закрытия. Я знаю, что мне нужно unistd.h, у меня уже есть это.C: невозможно распечатать из файла

#define MAXBUF 4096 
int main(int argc, char* argv[]){ 
int x = 0, y, z = 1, a;   //x: Counter, Y:int for open, z:another counter, a:int for read 
char buff[MAXBUF];    //set buffer size 
int fe,fn,ft;     //fe = found E, fn = found n, ft = found T 
if((y = open(argv[2], O_RDONLY)) == -1){ 
    errHandler("Couldn't open ", argv[2]); 
    } 
      . 
      . 
      . 

if(fn == 1){         //if fn returned true 
    printf("%d ", z++); 
    } 

while((a = read(y, buff, MAXBUF)) > 0){   

    if (buff == '\n' && fe && fn)  //<-- 
     printf("$\n%4d: ", z++); 
    else if (buff == '\n' && fe) 
     printf("\n");      //Flags for various options 
    else if (buff == '\t' && ft)   
     printf("^T"); 
    else if (buff == '\n' && fn) 
     printf("\n%4d: ", z++);   //<-- 
    else 
     printf("%c", buff); 
} 
close(y); 
if (close(y) == -1) 
    printf("Unable to close file"); 
return 0; 
} 

Редактировать: Вот объявления. «.» пропускают код, который просто устанавливает флаги.

+2

Вы дважды закрыли файл. Вы должны удалить первый экземпляр закрытия. –

+0

Что такое 'buff'? Типичная подпись для 'read' требует, чтобы она была' void * ', но вы сравниваете ее с' char'. – jwodder

+3

Отправьте сообщение [MCVE] (https://stackoverflow.com/help/mcve). Мы можем видеть некоторые возможные проблемы в вашем коде (такие как указано jwodder), но мы не можем дать окончательный ответ, если вы не покажете весь соответствующий код в MCVE. Например, логика опирается на значения переменных, которые вы не показывали ('fe',' fn', 'ft' и т. Д.). – kaylum

ответ

1

в вашем:

if (buff == '\n' && fe && fn)  //<-- 

Я предполагаю, что вы хотите проверить, если пустая строка была прочитана, проверяя его против символа новой строки. Однако buff не является символом; это указатель на все сохраненные символы. Для того, чтобы проверить, если первый символ buff символ новой строки, используйте:

if (*buff == '\n' && fe && fn)  //<-- 

* разыменовывает указатель и дает первый символ. То же самое для других проверок. Если эти проверки не получится, то напечатать строку:

else 
    printf("%s", buff); 

Обратите внимание на характер форматирования %s, не %c, чтобы напечатать строку (буфер) вместо одного символа.

+0

Теперь он работает. Благодарю. – user3300735

+0

Учитывая исходный код, я вижу, как вы получили * buff, но поскольку buff определяется как массив символов, я бы использовал buff [0] для чистоты. Если бы у нас был дополнительный char * bufp = buff, я бы пошел с * bufp (или bufp [0]) –

Смежные вопросы