2013-09-30 5 views
-2

У меня есть код C, чтобы прочитать текстовый файл:Чтобы прочитать содержимое файла в C

#include <stdio.h> 

int main() 
{  
    FILE *pf; 
    int ii; 
    int jj; 

    char *filename; 
    printf("enter file name"); 
    scanf("%s",filename);   

    printf("%s",filename); 

    pf = fopen("filename+.txt", "r"); 
    if(pf==Null) 
    { 
     printf("cant open"); 
    } 
    else 
    { 
     fscanf(pf,"%d,%d" ,&ii,&jj); 
     printf("%d,%d\n" ,ii,jj); 
    } 
    fclose(pf);  

    return 0; 
} 

Тем не менее я получаю ошибку сегментации. Входной текстовый файл содержит

2,3

я получаю ошибки сегментации (ядро сбрасывали), когда я запустить программу как ./readfile вход.
Что здесь не так, как я могу исправить это?

+0

У вас есть полностью неправильная подпись основного метода – rpeshkov

+0

В fopen первым параметром должно быть имя файла, нет "и другие корректировки, которые вы вводите. Как есть, вы ожидаете ошибку сегментации. – gnometorule

+0

И как у вас есть это сейчас, ваш последний абзац не описывает, как вы будете использовать эту программу: вместо этого просто введите ./readfile, если вы скомпилировали его под этим именем (без параметра командной строки cmd). – gnometorule

ответ

2

Здесь много ошибок.

После звонка fopen(), вы должны проверить, pf is NULL, потому что fopen() может потерпеть неудачу.

Вы пытаетесь открыть файл с именем filename+.txt. Разве вы не должны открывать файл, который был указан в качестве параметра?

Кроме того, структура main() должна быть int main(int argc, char **argv), вы не можете делать все, что хотите.

Проверьте, есть ли argc > 1, и в этом случае программа была запущена с параметрами, а имя файла должно быть указано в argv[1].

Update на комментарии: Это как ваш код должен выглядеть следующим образом:

int main() 
{ 
    char filename[512]; // reserve 512 bytes to receive the file name from input 
    FILE *pf; 
    int ii; 
    int jj; 

    printf("Enter file name: "); 
    scanf("%s", filename); 

    pf = fopen(filename, "r"); 

    if (pf) 
    { 
     fscanf(pf,"%d,%d", &ii, &jj); 
     printf("%d,%d\n", ii, jj); 
     fclose(pf); 
    } 
    else 
    { 
     printf("Failed to open file name %s", filename); 
    } 

    return 0; 
} 

Вы также можете сделать это, чтобы получить имя файла из параметров:

int main(int argc, char **argv) 
{ 
    FILE *pf; 
    int ii; 
    int jj; 

    if (argc > 1) 
    { 
     pf = fopen(argv[1], "r"); 
     if (pf) 
     { 
      fscanf(pf, "%d,%d", &ii, &jj); 
      printf("%d,%d\n", ii, jj); 
      fclose(pf); 
     } 
     else 
     { 
      printf("Failed to open file name %s", argv[1]); 
     } 
    } 
    else 
    { 
     printf("Insuficient parameters"); 
    } 

    return 0; 
} 

Или даже, если вы не «т хочет передать расширение файла:

int main(int argc, char **argv) 
{ 
    char *filename; 
    FILE *pf; 
    int ii; 
    int jj; 

    if (argc > 1) 
    { 
     filename = malloc(strlen(argv[1]) + 5); // alloc necessary memory 
     strcpy(filename, argv[1]); 
     strcat(filename, ".txt"); 

     pf = fopen(filename, "r"); 
     if (pf) 
     { 
      fscanf(pf, "%d,%d", &ii, &jj); 
      printf("%d,%d\n", ii, jj); 
      fclose(pf); 
     } 
     else 
     { 
      printf("Failed to open file name %s", filename); 
     } 
    } 
    else 
    { 
     printf("Insuficient parameters"); 
    } 

    return 0; 
} 
+0

Я попытался изменить код, как указано выше. Но я все еще получаю ошибку сегментации –

+0

Да, я вижу, вы изменили свой код, но теперь вы пытаетесь прочитать имя файла для унифицированного указателя. Вы должны использовать 'malloc() 'для распределения памяти для получения имени файла, который пользователь собирается ввести. И ваш' fopen() 'все еще пытается открыть файл w это имя буквально «filename + .txt». Полагаю, вы тоже должны это изменить. – Havenard

2

int main(char *) не является юридической сигнатурой main в C. Только

int main(void) 

и

int main(int argc, char **argv) 

законны. В вашем случае вам понадобится последний.

+0

Я отредактировал этот код, но все же кажется, что эта же ошибка –

2

Это неправильный способ указать аргументы в вашей программе. т.е. вы не можете сделать это:

int main(char *filename) 

Там должно быть ошибка компилятора при компиляции программы. Правильное определение:

int main(int argc, char **argv) 

Где argv массив строк. Попробуйте сделать этот эксперимент:

int main(int argc, char **argv) 
{ 
    int i; 
    for(i = 0; i < argc; i++) { 
     printf("arg %d is: \"%s\"\n", argv[i]); 
    } 
    return 0; 
} 

Затем напишите вашу программу, чтобы использовать список правильных аргументов, как указано выше.

Еще один момент заключается в том, что вы должны проверить возвращаемое значение fopen. Если это NULL, вам не следует пытаться получить доступ к файлу (потому что он не открывается).

+0

Я пробовал сменить код как: –

+0

выше, но я все равно получаю ошибку сегментации –

+0

Вы используете неинициализированный указатель 'filename', а затем пытаетесь прочитать Это. Указатель должен указывать на фактическую память. Если вы хотите, чтобы память хранила символы, объявляйте массив 'char' или динамически выделяйте' malloc'. Цель этого ответа состояла в том, чтобы помочь вам получить значение из командной строки, а не попробовать что-то совершенно другое. – paddy

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