2015-02-21 2 views
-3

Я пытаюсь прочитать первую строку текстового файла, а затем пропустить его с помощью fgets, но это дает мне ошибку seg, может кто-нибудь мне помочь? Он работал до того, как я добавил fgets, поэтому кажется, что проблема связана с fgets.Ошибка сегментации в C при использовании fgets и fscanf

Код

#include <stdio.h> 
#include <stdlib.h> 
#include <sched.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
    int N 
    const int STACK_SIZE=65536; 
    int col=0; 
    int i; 
    int j; 
    FILE *file1; 
    int s; 
    int row=0; 
    int prev='t'; 
    char m[1024]; 

    if(argc != 3) 
    { 
     fprintf(stderr, "Usage: %s <Executable> <Input file> <Threads>\n", argv[0]); 
     exit(1); 
    } 

    file1=fopen(argv[1],"r"); 
    if(file1==NULL) //check to see if file exists 
    { 
     fprintf(stderr, "Cannot open %s\n", argv[1]); 
     exit(1); 
    } 

    stack=malloc(STACK_SIZE); 
    if(stack==NULL) 
    { 
     perror("malloc"); 
     exit(1); 
    } 

    if(atoi(argv[2]) == 0) 
    { 
     fprintf(stderr,"Threads has to be a number.\n"); 
     exit(1); 
    } 

    fscanf(file1,"%d",&N); 
    rewind(file1); 

    fgets(m,sizeof(m),file1); 
    while((s=fgetc(file1)) != EOF) 
    { 
     if(s == ' ') 
     { 
      prev='a'; 
      continue; 
     } 
     if(s == '\n' && prev != '\n') 
     { 
      row++; 
      if(col != N) 
      { 
       fprintf(stderr, "File %s has incorrect columns.\n", argv[1]); 
       exit(1); 
      } 
      col=0; 
      prev='a'; 
     } 
     if(s != ' ' && s != '\n') 
     { 
      col++; 
      prev='a'; 
     } 
    } 
    if(row != N) 
    { 
     fprintf(stderr,"File %s has incorrect rows.\n", argv[1]); 
     exit(0); 
    } 
    rewind(file1); 

    for (i = 0; i < N; i++) 
    { 
     for (j = 0; j < N; j++) 
     { 
      fscanf(file1,"%d",&A[i][j]); 
     } 
    } 

    fclose(file1); 
} 
} 

EDIT 1: Fixed. Установка кода была единственной проблемой.

+3

Ваш * настоящий * код проверяет, что 'file1' для NULL проверяет файл, открытый до отправки его в' fscanf' или 'fgets', * right * ?? «Успение является матерью всех ...» – WhozCraig

+0

@WhozCraig да, я проверил его в своем реальном коде –

+1

Затем опубликуйте свой «настоящий» код, включая список '# include' и компилируемый' main() 'и комментарий - отметьте точную строку, где в вашем отладчике сообщается о сбое seg. Также validate 'arg [1]' на самом деле является фактическим нулевым указателем строки и что 'argc' не менее ** 2 **. – WhozCraig

ответ

3

Вы не убедитесь, что файл открыт, fscanf() и fgets() ожидать действительного FILE * вам нужно проверить возвращаемое значение fopen() «s , вы также должны убедиться, что аргумент был представлен в командной строке, для этого вы можете проверить argc в следующем коде пример

int main(int argc, char **argv) 
{ 
    char buffer[1024]; 
    FILE *file; 

    if (argc < 2) 
    { 
     fprintf(stderr, "you need to provide a file name.\n"); 
     return 1; 
    } 

    file = fopen(argv[1], "r"); 
    if (file == NULL) /* problem opening */ 
    { 
     fprintf(stderr, "error openning %s\n", filename); 
     return 2; 
    } 
    if (fgets(buffer, sizeof(buffer), file) != NULL) 
     printf("%s\n", buffer); 
    fclose(file); /* close the file */ 
    return 0; 
} 

код выше не подведет, даже если программа была вызвана с неправильным количеством аргументов или программа не может открыть файл, или если он не в состоянии прочитайте его.


1. fopen() возвращает NULL, когда он не может открыть файл.

+0

Извините, я редактировал сообщение. Это было в моем коде, но я забыл включить его здесь –