LINUX.ORG.RU

Ответ на: комментарий от Dorif

Тут похоже разобрались. Я переделал код, так чтобы проверялись коды ошибок в вызываемых функциях. Похоже проблема не в этом. Но все равно лучше добавь проверку на ошибки везде где только можно.

Вот пример:

#include <errno.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/stat.h>  
#include <sys/types.h>  
#include <stdio.h>
#include <string.h>

#define try_call(FUNC) \
if((FUNC)==-1) \
{\
  char _tmp[500];\
  char _error_message[500];\
  strerror_r(errno,_error_message,sizeof(_error_message));\
  snprintf(_tmp,sizeof(_tmp),"%s:%s:%d - %s\n",__FILE__,__FUNCTION__,__LINE__,_error_message);\
  printf("%s\n",_tmp);\
  exit(0);\
}

void itoa(unsigned long n, char s[]);  
int help(); 
int ferr(); 
int stl(char s[]); 
int sc(char*s, char* t); 
void dchk(int f); 

void func_number(char* file_name);
void func_show_tabs(char* file_name); 
void func_show_ends(char* file_name); 

int main(int argc, char **argv)
{ 
  if(argc==3)
  {
    if(!sc(argv[1],"-n")||!sc(argv[1],"--number"))
    {
      func_number(argv[2]);
    } 
    else if(!sc(argv[1],"-T")||!sc(argv[1],"--show-tabs"))
    {
      func_show_tabs(argv[2]); 
    } 
    else if(!sc(argv[1],"-E")||!sc(argv[1],"--show-ends"))
    {
      func_show_ends(argv[2]); 
    }
    else
      help(); 
 }
 else if(argc>3||argc==1||!sc(argv[1],"-h")||!sc(argv[1],"--help"))
  help(); 
 else
 {
    if(!sc(argv[1],"-v")||(!sc(argv[1],"--version")))
    { 
      try_call(write(1,"cloncat version 0.5\n",20)); 
      exit(0);
    } 
    else
    {
      int fd;
      try_call(fd=open(argv[1],O_RDONLY)); 
      dchk(fd);
      short a;
      while(read(fd,&a,1)>0)
      {
        try_call(write(1,&a,1)); 
      }
      close(fd);
      exit(0); 
    } 
 } 
}

void func_number(char* file_name)
{
    int fd;
    try_call( fd=open(file_name,O_RDONLY) ); 
    dchk(fd); 
    short a; 
    unsigned long i; 
    i=1; 
    try_call( write(1,"1: ",3) ); 
    while(read(fd,&a,1)>0)
    { 
      if(a=='\n')
      { 
        unsigned long pos;
        try_call(pos=lseek(fd,0,SEEK_CUR));
        try_call(lseek(fd,1,SEEK_CUR));
        if(read(fd,&a,1)==0)
        { 
          try_call(write(1,&a,1));
          try_call(close(fd)); 
          exit(0); 
        }
        else
        { 
          char b[11]; 
          ++i; 
          itoa(i,b); 
          try_call(write(1,"\n",1));
          try_call(write(1,b,stl(b)));
          try_call(write(1,": ",2)); 
        } 
        try_call(lseek(fd,pos,SEEK_SET)); 
      } 
      else 
        try_call(write(1,&a,1)); 
    } 
}

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Еще большие функции надо разбивать на более мелкие для лучшей читабельности.

pathfinder ★★★★
()
Ответ на: комментарий от vga

Я знаю. Просто на автомате писал. Ни у кого, что ли не было. когда по привычке что- то делалось эмм.. через жо^W?

Dorif ★★
() автор топика
Ответ на: комментарий от Reset

Да оно по- любому не поможет- системные вызовы не буферизуются.

Dorif ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.