2016-03-19 2 views
-1

Хорошо, так что в основном название говорит обо всем. Я работаю над проектом, где я получаю ошибку сегментации сразу после ввода имени файла, который я хочу открыть. Я создал небольшую программу, которая сделала именно это, но когда я реализую ее в своем проекте, она не работает. Я мог бы что-то игнорировать. Было бы здорово, если бы кто-нибудь мог это указать.Проблемы с открытием файла внутри функции C

#include<stdio.h> 
#include<stdlib.h> 
#include<ctype.h> 
#include<string.h> 

//function prototypes 
void printmenu(); 
void getcipher(char **arr, int *count, FILE **infile); 

int main() 
{ 
int flag = 1; //exit flag for menu loop 
int choices; //user input for menu 
int count = 0; 

char arr[7000][25]; //store words in this array 

FILE *infile = NULL; //input cipher file 


while(flag) 
{ 
    printmenu(); 

    scanf("%d", &choices); 
    getchar(); 


    while(choices < 1 || choices > 4) 
    { 
     printf("\nInvalid input. Try again..."); 

     scanf("%d", &choices); 
     getchar(); 

    }//end while 

    switch(choices) 
    { 
     case 1: 
      getcipher((char **)arr, &count, &infile); 
      break; 
     case 2: 
      printf("2"); 
      break; 
     case 3: 
      printf("3"); 
      break; 
     case 4: 
      flag = 0; 
      break; 
    }//end switch 

}//end while 

return 0; 

} 

void printmenu() 
{ 
printf("\n%s", "Menu Choices"); 
printf("\n%-40s%-20s", "Use Cipher text file as cipher key", "Enter 1"); 
printf("\n%-40s%-20s", "Create cipher using a text file","Enter 2"); 
printf("\n%-40s%-20s", "Decode existing cipher", "Enter 3"); 
printf("\n%-40s%-20s\n\n", "Exit Program","Enter 4"); 

} 

void getcipher(char **arr, int *count, FILE **infile) 
{ 
int flag;  //flag for getting cipher text file 

char buffer[1000]; //buffer for reading in lines 

char *token;   

int letters = 0; //index for letters 
int low;  //index for converting to lowercase 


//Gets cipher text file 
printf("\nEnter the name of the cipher text file: "); 
scanf("%s", buffer); 

printf("\n%s\n", buffer); 

*infile = fopen(buffer, "r"); 

if(!(*infile)) 
{ 
    printf("Unable to open file. Exiting..."); 
    exit(1); 
}//end while 

//inputs words from cipher text file to array 
while(fgets(buffer, 1000, *infile)) 
{ 
    token = strtok(buffer, " "); 

    strcat(arr[*count], token); 

    count++; 

    while((token = strtok(NULL, " ")) != NULL) 
    { 
     strcat(arr[*count], token); 

     count++; 
    }//end while 

}//end while 


printf("\n%d" , *count); 
int i = 0; 
//print array 
while(i < *count) 
{ 
    printf("\n%s ", arr[i]); 

    i++; 
}//end while 




} 

Это моя вторая меньшая программа, которая открыла файл внутри функции. Я в основном скопировал это в свой проект.

#include<stdio.h> 
#include<string.h> 


void openfile(FILE **file); 

int main() 
{ 
    FILE *file = NULL; 

    openfile(&file); 

    return 0; 
} 

void openfile(FILE **file) 
{ 
    char buffer[100]; 

    printf("Enter the name of file: "); 
    scanf("%s", buffer); 

    *file = fopen(buffer, "r"); 

    if(*file) 
     printf("\nSuccess!!"); 
} 
+0

Вы не используете указатель файла вне функции, но вы также не закрываете файл. Не уверен, что вы пытаетесь сделать с использованием такого файла, как я. – crashmstr

+1

Вы передаете двумерный массив функции, ожидающей 'char **'. Это не верно. – EOF

+0

У меня есть больше функций, чтобы написать это лишь небольшая часть того, что я хотел сделать. Вот почему я пытался передать файл по ссылке. Кроме того, да, я забыл закрыть файл, но это не имеет значения, потому что я не могу даже открыть его. –

ответ

1

Проблема заключается в том, что вы литья arr, который char [7000][25], чтобы char ** при прохождении его getcipher. Эти два заявления несовместимы. Первый - это плоский двумерный массив, а второй - массив указателей, каждый из которых указывает на свой собственный вторичный массив. В общем, если вы выбрали один тип указателя другому, как, например, вы, вероятно, вводите ошибку.

Чтобы это исправить, вы можете изменить свое char **arr заявление в getcipher к char arr[7000][25] или char arr[][25] или char (*arr)[25]. Если вы не хотите жестко связать размер, вы можете передать его как параметр, если он предшествует параметру массива.

Вторая проблема: у вас есть аргумент int *count в getcipher. В этом случае это указатель на один int. Но вы увеличиваете его с помощью count++ в нескольких местах. Это увеличит указатель, а не целое число, на которое он указывает. Измените его на (*count)++;

+0

Спасибо. Это привело бы меня к проблемам позже. Я изменил параметры, однако я все еще получаю seg-ошибку после ввода имени файла. –

+0

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

+0

Теперь он работает после использования содержимого оператора, увеличивающего счетчик. Спасибо, что терпеливы со мной и за советом. –

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