2014-01-15 51 views
0

來源:分段故障數據集

#include<stdio.h> 

int load(char fileName[], int array[]); 
int sort(int array[], int length); 
int print(int length, int array[]); 

int main() { 

    char fileName[300]; 
    int numList[300]; 
    int length; 

    printf("File Name: "); 
    scanf("%s", fileName); 

    length = print(sort(numList,load(fileName, numList)), numList); 
    printf("\nLength: %i\n", length); 
    printf("Finished execution.\n"); 

    return 0; 
} 

int load(char fileName[], int array[]) { 

    FILE *input = fopen(fileName, "r"); 

    int length = 0, i = 0; 

    if(input == NULL) { 
     fprintf(stderr, "Error accessing file.\n"); 
    } else { 
     while(fscanf(input, "%i", &array[i]) != EOF) { 
     i++; 
     length++; 
     } 
    } 

    fclose(input); 
    return length; 
} 

int sort(int array[], int length) { 
    int a, b, c; 

    for (a = 0 ; a < (length - 1); a++) { 
    for (b = 0 ; b < length - a - 1; b++) { 
     if (array[b] > array[b+1]) { 
     c = array[b]; 
     array[b] = array[b+1]; 
     array[b+1] = c; 
     } 
    } 
    } 
    return length; 
} 

int print(int length, int array[]) { 
    int i; 

    printf("\n[NUMBERS]\n\n"); 
    for (i = 0; i< length; i++) { 
     printf("[N]%i\n", array[i]); 
    } 
    return length; 
} 

我需要使用I/O重定向提交整數的隨機數據集的節目,但是當我使用重定向提交包含數據集的文件,它會拋出一個段錯誤。我非常熟悉segfaults,以及爲什麼他們會傳統上拋出,但我一直在這個計劃前面呆了好幾個小時,但沒有找到問題的根源。

+3

您是否嘗試使用調試器來查看段錯誤發生的位置?另外 - 它看起來你的代碼只從STDIN中讀取文件名,其他的一切都是直接從文件中讀取的。你不能從文件中重定向顯式讀取;您只能重定向爲每個進程打開的三個IO句柄。 – Amadan

+1

你說你需要使用重定向,但這意味着使用標準輸入/標準輸出。但是,您的程序顯然是嘗試從文件中讀取數據。那真的沒有網格。 – RichardPlunkett

+0

即使在'input == NULL'的情況下,你也會'輸入'。 – timrau

回答

0

這裏有一些修改建議,使從標準輸入,而不是從一個指定的文件,這是讀你的代碼,你說什麼是需要:

 int main() { 

      //char fileName[300]; 
      int numList[300]; 
      int length; 

      //printf("File Name: "); 
      //scanf("%s", fileName); 

      length = print(sort(numList,load(stdin, numList)), numList); 
      printf("\nLength: %i\n", length); 
      printf("Finished execution.\n"); 

      return 0; 
     } 

     int load(FILE* input, int array[]) { 

      //FILE *input = fopen(fileName, "r"); 

      int length = 0, i = 0; 

      if(input == NULL) { 
       fprintf(stderr, "Error accessing file.\n"); 
      } else { 
       while(fscanf(input, "%i", &array[i]) != EOF) { 
       i++; 
       length++; 
       } 
      } 

      //fclose(input); 
      return length; 
     } 

     int sort(int array[], int length) { 
      int a, b, c; 

      for (a = 0 ; a < (length - 1); a++) { 
      for (b = 0 ; b < length - a - 1; b++) { 
       if (array[b] > array[b+1]) { 
       c = array[b]; 
       array[b] = array[b+1]; 
       array[b+1] = c; 
       } 
      } 
      } 
      return length; 
     } 

您需要更新接近頂部的load()原:int load(FILE* input, int array[]);