2013-04-11 3 views
-2

Я пытаюсь открыть файл и посмотреть, сколько строк, слов, символов и предложений содержится в файле. Все компилируется нормально, но когда программа запускается, он печатает инструкции, тогда возникает ошибка «ошибка сегментации (core dumped)». Я знаю, что файл открывается отлично, поэтому я предполагаю, что я делаю что-то неправильно в processFile. Помогите было бы здорово!У меня проблемы с ошибкой сегментации C

P.S. #include «lib09.h» являются три функции после того, как основной()

#include <stdio.h> 
#include <stdlib.h> 
#include "lib09.h" 

int main(void) 
{ 
    FILE *fileIn; 
    int *lines = 0, 
     *words = 0, 
     *sentences = 0, 
     *characters = 0; 


    printInstructions(); 

    fileIn = fopen("input09.txt", "r"); 

    if (fileIn == NULL) 
     { 
     printf("\n\nERROR\n"); 
     printf("FILE DOES NOT EXIST.\n"); 
     printf("TRY AGAIN\n\n"); 
     } 

    else 
     { 
     processFile(fileIn); 
     printReport(lines, words, characters, sentences); 
     } 

    return 0; 
} 

// 
//Prints Instructions 
// 
void printInstructions() 
{ 
    printf("\n====================================================\n"); 
    printf(" Program reads a file and returns the number of \n"); 
    printf("lines, words, characters, and sentences in the file.\n"); 
    printf("====================================================\n\n"); 

    return; 
} 

// 
//Processes File 
// 
int processFile(FILE *fileIn) 
{ 
     int ch, 
     *lines = 0, 
     *sentences = 0, 
     *characters = 0, 
     *words = 0; 

    while(fscanf(fileIn, "%d", &ch) != EOF) 
    { 
     ch = fgetc(fileIn); 

       if(ch == '\n' || ch == 60) 
         return *lines++; 

       if(ch == '.') 
         return *sentences++; 

       if(ch != ' ' || ch != '.' || ch != '\n') 
         return *characters++; 

       if(ch == ' ') 
         return *words++; 
    } 

    fclose(fileIn); 

    return 0; 
} 

// 
//Prints Values from File 
// 
void printReport(int *words, int *lines, int *characters, int *sentences) 
{ 
    printf("This file contains %d lines.\n", *lines); 
    printf("This file contains %d words.\n", *words); 
    printf("This file contains %d characters.\n", *characters); 
    printf("This file contains %d sentences.\n\n", *sentences); 

    return; 
} 
+1

Вы пишете четыре нулевых указателей в вашей '' функции ProcessFile(). Довольно уверен, что вы хотели передать эти параметры в качестве адресных входных параметров функции и передать параметры '& var' обратно на стороне вызывающего абонента. Конечно, сама функция в любом случае ошибочна, так как она будет неправильно возвращать момент, когда любой символ обрабатывается в любом случае. Я не думаю, что, учитывая имя функции *, любой из этих операторов 'return' должен быть там. – WhozCraig

+1

Ах, да, ежедневная «Я пишу в ячейки памяти, где ничего не возникает, почему я получаю вопрос segfault». Голосовать, чтобы закрыть. – Lundin

ответ

0

на главном:

int lines = 0, 
    words = 0, 
    sentences = 0, 
    characters = 0; 
... 
processFile(fileIn, &lines, &word,&sentences, &characters); 

в ProcessFile

processFile(FILE* fileIn, int* lines, int* word, int* sentences, int* characters){ 
... 
} 

примечание :

fscanf(fileIn, "%d", &ch) < - неправильно

return *lines++; < - не возвращается

0

The * линии * слова и т.д., все указатели, которые никогда не инициализируются собственных адресов памяти.

Если вы создаете их за пределами main как ints и удаляете все префиксы *, то они должны работать.

0

Сделать этот Интс не указатели на Int

*lines = 0, 
*sentences = 0, 
*characters = 0, 
*words = 0; 

удаления * в каждых из них, а также, когда вы увеличиваете их

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