2017-02-10 9 views
-2

ОБНОВЛЕНО КОДА ПОЛНОСТЬЮ ФУНКЦИОНАЛЬНОГО ***ошибки сегментации при записи в файл

Я новичок в C/C++, и я написал кусок кода, который бы подсчитать, сколько раз программы запуска, написав " count "в файл каждый раз. Кроме того, когда я пытаюсь запустить его, я получаю ошибку сбоя seg. Кто-нибудь может сказать мне, почему?

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

int main(int argc, const char * argv[]) { 
    FILE *fp; 
    printf("LINE 13 CLEAR"); 
    fp = fopen("MyPlayground.rtf", "r"); 
    int value; 
    fscanf(fp, "%d", &value); 
    printf("Value is %d", value); 
    //printf("LINE 14 CLEAR"); 
    if(fp== NULL) 
    { 
     printf("LINE 17 CLEAR"); 
     if(fopen("MyPlayground.rtf", "w")==NULL) 
     { 
      exit(0); 
     } 
     //fprintf(fp,"%d",0); 
     fclose(fp); 
     return 0; 
    } 
    //printf("LINE 25 CLEAR"); 
    fp = fopen("MyPlayground.rtf", "w"); 
    //printf("LINE 30 CLEAR"); 
    fprintf(fp,"%d",++value); 
    fclose(fp); 
} 

EDIT: Программа работает до тех пор, пока не будет напечатана "printf (" LINE 17 CLEAR "); и после этого он дает мне ошибку «EXC-BAD-ACCESS» в следующей строке.

EDIT1: Fixed установил два различных пути

EDIT2: Добавлена ​​проверка ошибок для второго fopen(...) заявления.

Также не стесняйтесь прокомментировать любые ошибки стиля и вещи, которые я должен/не должен делать. Благодарю.

+0

Проверьте, чтобы все ваши вызовы fopen и fscanf работали, изучая их возвращаемые значения. –

+0

В каталоге '/ Desktop/hw3 /' есть разрешение на запись. – Shravan40

+0

Проведите 30 минут, чтобы изучить отладчик вашей системы и сэкономить дни и часы написания отладочных заявлений на всю оставшуюся жизнь. Вам действительно нужно только знать, как устанавливать и очищать точки останова, входить в функции и печатать переменные ... –

ответ

3

Держу пари, это происходит только при первом запуске. Причина, по которой линия 11:

11 fprintf (fp, 0);

Вы в основном передаете fprintf нулевой указатель. Что вы, вероятно, хотели сделать, это:

11 fprintf (fp, "0");

Вот как я это понял. Я составил его с отладочной информацией и побежал его с помощью отладчика ... lldb, чтобы быть точным:

(lldb) Б.Т. * нить # 1: TID = 0xacaaf, 0x00007fff90f4dcf6 libsystem_c.dylib __vfprintf + 327, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0) * frame #0: 0x00007fff90f4dcf6 libsystem_c.dylib __vfprintf + 327

frame #1: 0x00007fff90f762e7 libsystem_c.dylib`__v2printf + 471 

frame #2: 0x00007fff90f766bc libsystem_c.dylib`__xvprintf + 633 

frame #3: 0x00007fff90f4db36 libsystem_c.dylib`vfprintf_l + 54 

frame #4: 0x00007fff90f4669b libsystem_c.dylib`fprintf + 186 

frame #5: 0x0000000100000e9d test.out`main(argc=1, 

ARGV = 0x00007fff5fbffc60) + 109 в test.c: 11 кадр # 6: 0x00007fff8f9c95fd libdyld.dylib`start + 1

... если смотреть на раме 5, вы увидите, мешающий строка кода ,

+0

fprintf не передается пустой указатель. Если 'fp = fopen («/Desktop/hw3/hw3/MyPlayground.txt »,« w »);' не находит файл с этим именем в этом каталоге, он просто создает его.Поэтому я не понимаю, почему после этого утверждения будет null. –

+0

@MarcoNeves он не говорит, что 'fp' имеет значение null, он имел в виду второй параметр. –

+0

О, я вижу, так что 'fprintf (fp,"% d ", 0);' технически исправить это, не так ли? –

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