2015-12-21 44 views
-1

我有這個錯誤的大問題。我盡我所能從文件中讀取(fscanf,fgets,gets,fgetln,fread,read),但我無法管理它。每次出現分段錯誤(核心轉儲)錯誤)。我需要做些什麼才能打印我的文件內容。從文件讀取 - 分段錯誤(核心轉儲)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <ctype.h> 
#include <signal.h> 
#include <termios.h> 
#include <dirent.h> 
#include <err.h> 
#include <errno.h> 


#define MAX_COMAND_LENGTH 100 
#define MAX_NUMBER_OF_PARAMS 10 

int i=0; 

char cmd[MAX_COMAND_LENGTH+1]; 
char *params[MAX_NUMBER_OF_PARAMS+1]; 

char cmdline[1000]; 
int hfd=-1,ifd=-1,ofd=-1; 
int lines_in_hist = 0; 
int curent_line = -1; 

struct termios save_term; 

char *HISTORY; 

char *TEMP,*TEMP2,*ax; 

void parseCmd(char *cmd, char **params) 
{ 
    for(i=0; i< MAX_NUMBER_OF_PARAMS;i++){ 
     params[i]=strsep(&cmd," "); 
     if(params[i] == NULL) 
      break; 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    char *username = getenv("USER"); 
    int status=-1;//pentru deschiderea fisierelor 
    int status1; 
    char *directory="/tmp"; 
    char *file_name; 
    char buff[256]; 

    while(1) 
    { 
     printf("%[email protected] >>", username); 

     //citeste de pe linia de comanda 
     if(fgets(cmd,sizeof(cmd),stdin)==NULL) 
      break; 

     //elimina terminatorul de sir de pe o linie noua 
     if(cmd[strlen(cmd)-1]=='\n') 
      cmd[strlen(cmd)-1]='\0'; 

     parseCmd(cmd,params); 

     if(!strcmp(params[0],"exit")) 
      exit(0); 

     if(!strcmp(params[0],"help")) 
      help(); 

     if(!strcmp(params[0],"version")) 
      version(); 


     if(!strcmp(params[0],"info")) 
      if(!strcmp(params[1],"tail")) 
       infoTail(); 
      else if(!strcmp(params[1],"uniq")) 
       infoUniq(); 
      else if(!strcmp(params[1],"cd")) 
       infoCd(); 

     if(!strcmp(params[0],"uniq")) 
     { 
      if(!strcmp(params[1],"-d")) 
      { 
       printf("Enter the name of file\n"); 
       gets(file_name); 

       if((status=open(file_name,O_RDONLY))==-1) 
       { 
        printf("Nu am putut deschide fisierul!"); 
        exit(1); 
       } 
       else 
       { 
        printf("\t\t ==>%s<==\n",file_name); 
        sscanf(file_name,"%s",buff); 
        printf("Continutul fisierului:\n%s\n", buff); 
       } 
       close(status); 
      } 
     } 
     if(!strcmp(params[0],"cd")) 
     { 
      status1=chdir(directory); 
      if(status1 !=0) 
       perror("Eroare!"); 
     } 
    } 

    return 0; 
} 
+0

如果你在崩潰後在gdb中做了一個bt,你會看到它在哪裏爆炸它的負載。可能會讓你更接近根本原因。一般也可以打開.core文件。 –

回答

0

只需導入打開。如果您使用「with open __」,那麼您可以讀取該文件。取決於您想要使用哪種類型的讀取。對於二進制,你可以使用「rb」,但「r」也可以。實際上默認是「wb」。

1

這些線

char *file_name; 

// ... 

gets(file_name); 

嘗試讀取使用未初始化的指針數據,這可能會導致一個段錯誤讀取鍵盤到一個未定義的緩衝區,當你按下回車,之前,你甚至嘗試打開文件。此外,不推薦使用gets()。奇怪的是,你確實知道fgets()和尾隨newline

0

找到哪裏是你的錯誤,你可以Valgrind的使用:

gcc -g stack.c 
valgrind ./a.out 

這告訴你,在該行程序段錯誤86

==3384== Invalid read of size 1 
==3384== at 0x4C2F1B1: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==3384== by 0x400C52: main (stack.c:86) 
==3384== Address 0x0 is not stack'd, malloc'd or (recently) free'd 

此錯誤僅發生時不存在用於參數你的「uniq」命令。

[email protected] >> 
[email protected] >> 
[email protected] >>uniq stack.c 
[email protected] >>uniq 
[1] 4154 segmentation fault (core dumped) ./a.out 

因爲在這種情況下PARAM [1]時不被初始化:

if(!strcmp(params[1],"-d")) 

的溶液,使您parseCmd返回檢測到的參數的數量,並檢查結果是否== 2(uniq的MYFILE )。