2015-11-20 2 views
-1

Мне нужно написать функцию, которая принимает указатель char в качестве аргумента (строка для имени файла) и читает в файле по одному слову за раз. Это мой код до сих пор:Ошибка сегментации при открытии файла в C

void processText(char * filename) 

char tmpWord[30]; 
char tmpFile[200]; 
char * word; 

FILE *fp; 

index = 0; 

strcpy(tmpFile, filename); 

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


fp = fopen(filename, "r"); 

if (fp == NULL) 
{ 
    printf("Sorry, file does not exist.\n"); 
    exit(EXIT_FAILURE); 
} 

while (fscanf(fp, "%s", tmpWord) != EOF) 
{ 
    printf("%s\n", tmpWord); 
} 
fclose(fp); 

Когда я запускаю прохождение программы в строке «test.txt» он выводит:

test.txt 


Sorry, file does not exist. 

Без если NULL, он просто возвращает ошибку сегментации после печати теста. текст.

Если это помогает, когда я ввожу «test.txt» в fopen, вместо этого он работает отлично, поэтому я знаю, что путь к файлу верен.

+0

Попробуйте 'printf ("% d \ n ", strlen (имя файла));' и дайте мне знать, что вы получаете. – user3386109

+0

Вы можете посмотреть [** Читать из файла CSV и отдельно в строки **] (http://stackoverflow.com/questions/33761409/read-from-csv-file-and-separate-into-variable) –

+0

Оператор печати дает мне 9, я также добавил код для удаления новой строки в конце строки (которая работала), но она все еще не может найти файл. – PresumablyZach

ответ

1

Я предлагаю попробовать и распечатать свой filename, окруженный кавычками или другим разделительным символом, возможно, #? Это покажет вам, есть ли какие-либо символы пробела в переменной вашего имени файла. Если есть пробелы в символах пробела, он может не найти ваш файл, поскольку он будет искать "test.txt " вместо "test.txt".

1

При отправке filename необходимо рассмотреть функцию для открытия и чтения. Вам не только нужно, чтобы подтвердил вызов fopen, но перед тем, как добраться до этой точки, вы должны подтвердить, что filename является указателем на действительный адрес, а не указателем NULL. Кроме того, поскольку вы объявили char tmpWord[30];, вы должны (1) инициализировать массив до нуля и (2 - что более важно), ограничить размер слова, считанного fscanf, до 29 символов для обеспечения того, что tmpWord будет содержать строку null-terminated.

Ввод куски вместе, вы можете использовать следующий как processText:

void processText (char *filename) 
{ 
    if (!filename) { /* validate filename not NULL */ 
     fprintf (stderr, "processText() error: invalid argument.\n"); 
     exit(EXIT_FAILURE); 
    } 

    char tmpWord[30] = {0}; /* initialize variables */ 

    FILE *fp = fopen (filename, "r"); 
    if (!fp) {  /* validate file is open */ 
     fprintf (stderr, "processText() error: file open failed '%s'.\n", 
       filename); 
     exit(EXIT_FAILURE); 
    } 

    printf ("\n reading words from : %s\n\n", filename); 

    /* read a maximum of 29 chars in each word into tmpWord & print */ 
    while (fscanf (fp, " %29s", tmpWord) != EOF) 
     printf(" %s\n", tmpWord); 

    putchar ('\n'); 

    fclose(fp); 
} 

Простой пример вызова processText из main() может быть:

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

void processText (char *filename); 

int main (int argc, char **argv) { 

    if (argc < 2) { /* validate one argument given */ 
     fprintf (stderr, "error: insufficient input, usage: %s filename.\n", 
       argv[0]); 
     return 1; 
    } 

    processText (argv[1]); 

    return 0; 
} 

С тест ввода/вывода существа:

$ cat dat/captnjack.txt 
This is a tale 
Of Captain Jack Sparrow 
A Pirate So Brave 
On the Seven Seas. 

Выход

$ ./bin/read_file_into_words dat/captnjack.txt 

reading words from : dat/captnjack.txt 

    This 
    is 
    a 
    tale 
    Of 
    Captain 
    Jack 
    Sparrow 
    A 
    Pirate 
    So 
    Brave 
    On 
    the 
    Seven 
    Seas. 

Позвольте мне знать, если у вас есть какие-либо дополнительные вопросы, и я буду рад помочь.

+0

Это сработало отлично, спасибо вам большое за вашу помощь! Единственный вопрос, который у меня есть, это то, что делает путчар в конце (это функция, которую я никогда не видел и мне просто интересно)? – PresumablyZach

+0

Это не делает ничего значимого, я просто положил его туда, чтобы добавить еще одну новую строку в конце файла, чтобы результат выглядел лучше:: 'Вы можете уничтожить его или перенести на' main() '. –

+0

Прохладный, еще раз спасибо! Вы оказали огромную помощь! – PresumablyZach

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