ошибка сегментации в файловых операциях в c - PullRequest
1 голос
/ 18 апреля 2010
#include<stdio.h>

/* this is a lexer which recognizes constants , variables ,symbols, identifiers , functions , comments and also header files . It stores the lexemes in 3 different files . One file contains all the headers and the comments . Another file will contain all the variables , another will contain all the symbols. */

int main()
{
    int i;
    char a,b[20],c;
    FILE *fp1;

    fp1=fopen("source.txt","r"); //the source file is opened in read only mode which will passed through the lexer

    //now lets remove all the white spaces and store the rest of the words in a file 

    if(fp1==NULL)
    {
        perror("failed to open source.txt");
        //return EXIT_FAILURE;
    }
    i=0;
    while(1)
    {


        a=fgetc(fp1);

        if(a !="")
        {
            b[i]=a;
        }
        else
        {


            fprintf(fp1, "%.20s\n", b);
            i=0;
            continue;
        }
        i=i+1;                  

        /*Switch(a)
        {
            case EOF :return eof;
            case '+':sym=sym+1;

            case '-':sym=sym+1;

            case '*':sym=sym+1;

            case '/':sym=sym+1;

            case '%':sym=sym+1;

            case '
        */
    }
return 0;
}

как этот код заканчивается ошибкой сегментации?

Ответы [ 5 ]

2 голосов
/ 18 апреля 2010

Похоже, что требуется проверка, чтобы убедиться, что он не записывает после конца массива b. Если он читает более 20 символов, он пропишет его и испортит стек.

2 голосов
/ 18 апреля 2010

Кроме того, строка b, вероятно, не заканчивается нулем. В какой-то момент в вашем коде вам нужно:

 b[i] = '\0';
0 голосов
/ 18 апреля 2010

Segfault ?? обычно бесконечный цикл ...


Используйте следующее ...

#include<stdio.h>

/* this is a lexer which recognizes constants , variables ,symbols, identifiers , functions , comments and also header files . It stores the lexemes in 3 different files . One file contains all the headers and the comments . Another file will contain all the variables , another will contain all the symbols. */

int main()
{
    int i;
    char a,b[20],c;
    FILE *fp1;

    fp1=fopen("source.txt","r"); //the source file is opened in read only mode which will passed through the lexer

    //now lets remove all the white spaces and store the rest of the words in a file 

    if(fp1==NULL)
    {
        perror("failed to open source.txt");
        //return EXIT_FAILURE;
    }
    i=0;
    while(!feof(fp1))
    {


        a=fgetc(fp1);

        if(a !="")
        {
            b[i]=a;
        }
        else
        {

            b[i]='\0';
            fprintf(fp1, "%.20s\n", b);
            i=0;
            continue;
        }
        i=i+1;                  

        /*Switch(a)
        {
            case EOF :return eof;
            case '+':sym=sym+1;

            case '-':sym=sym+1;

            case '*':sym=sym+1;

            case '/':sym=sym+1;

            case '%':sym=sym+1;

            case '
        */
    }
return 0;
}

GOODLUCK !!

CVS @ 2600Hertz

0 голосов
/ 18 апреля 2010

Используйте ваше время так:

...
 while((a=fgetc(fp1))!=EOF)
    {
        if(a !="")
        {
            b[i]=a;
        }
...

Вы будете каждый раз проверять, отличается ли a от EOF. Если равно EOF, обработка будет остановлена.

Я хотел бы рассмотреть чтение большего буфера с помощью fread () / fgets () и анализировать полученную строку вместо чтения посимвольно Я думаю, что это может улучшить общую производительность вашего парсера.

0 голосов
/ 18 апреля 2010

Нет проверки для проверки End of File.

Изменение

while(1) 

до

while (!feof(fp1))

EDIT:

Но причиной ошибки сегмента является отсутствующий NULL символ в конце b. Вы можете добавить символ NULL в конце b непосредственно перед записью его в файл:

b[i] = 0; // i must <=19
fprintf(fp1, "%.20s\n", b);

Таким образом, вы также должны убедиться, что вы не добавляете больше 19 char в b, чтобы у вас всегда было место для записи NULL char.

...