При выводе некоторых строк в файл GDB сообщал об ошибке сегментации - PullRequest
0 голосов
/ 29 сентября 2019

Я бы хотел отсортировать словарь из файла и сначала записать его в другой файл. Во время процесса он всегда будет зависать, когда программа записывает строку в строку 2331 исходного файла.

Я использовал codeblock и gcc для его запуска, даже разбил цикл for на две части. Но ничего не работает.

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

#define MAX_LENGTH 20
#define min(x, y, z) ((((x)<(y))?(x):(y))<(z))?(((x)<(y))?(x):(y)):(z)
#define isChar(ch) (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z'))
#define isLowCase(ch) ('a' <= ch && ch <= 'z')
#define ORIGINAL_VOCABULARY "vocabulary.txt"
#define SORTED_VOCABULARY "sorted_vocabulary.txt"
#define FILE_TO_BE_CORRECT "words.txt"

void update_the_vb_dict(long* vb_address, int i_alpha, int length, int signal)
{
    if (signal == 0) for (;i_alpha < 52;i_alpha++) vb_address[i_alpha] += length * sizeof(char);
    else if (signal == 1) vb_address[i_alpha] += length * sizeof(char);
    else if (signal == 2) for (i_alpha = 51;i_alpha > 0;i_alpha--) vb_address[i_alpha] = vb_address[i_alpha-1];
}

void sort_the_vocabulary(FILE *vb, FILE *s_vb, long* vb_address)
{
    int output_address, i;
    char *temp_str;
    temp_str = (char*)malloc(MAX_LENGTH+1);
    //update the vb_address
    for (i = 0;!feof(vb) && i < 2331;i++)
    {
        fscanf(vb, " %s", temp_str);
        output_address = (isLowCase(*temp_str) ? *temp_str - 'a' : *temp_str - 'A');
        update_the_vb_dict(vb_address, output_address + 1, strlen(temp_str) + 2, 0);
        fprintf(s_vb, "%s\n", temp_str);
    }
    for (;!feof(vb);i++)
    {
        fscanf(vb, " %s", temp_str);
        output_address = (isLowCase(*temp_str) ? *temp_str - 'a' : *temp_str - 'A');
        update_the_vb_dict(vb_address, output_address + 1, strlen(temp_str) + 2, 0);
        fprintf(s_vb, "%s\n", temp_str);
    }

int main()
{
    long vb_address[52] = {0};
    FILE *vb, *s_vb;
    if ((vb = fopen(ORIGINAL_VOCABULARY, "r")) == NULL) exit(0);
    s_vb = fopen(SORTED_VOCABULARY, "w+");
    sort_the_vocabulary(vb, s_vb, vb_address);
    fclose(vb);
    fclose(s_vb);
    return 0;
}

Вот вывод из gdb

(gdb) run
Starting program: /home/tux/Developer/CB/C_ex1_NLP/a.out

Program received signal SIGSEGV, Segmentation fault.
_IO_vfprintf_internal (s=0x0, format=0x8000f78 "%s\n", ap=ap@entry=0x7ffffffede80) at vfprintf.c:1283
1283    vfprintf.c: No such file or directory.
(gdb) Quit
(gdb) where
#0  _IO_vfprintf_internal (s=0x0, format=0x8000f78 "%s\n", ap=ap@entry=0x7ffffffede80) at vfprintf.c:1283
#1  0x00007fffff064e54 in __fprintf (stream=<optimized out>, format=<optimized out>) at fprintf.c:32
#2  0x0000000008000df4 in sort_the_vocabulary (vb=0x8403260, s_vb=0x0, vb_address=0x7ffffffedfb0) at main.c:57
#3  0x0000000008000eb0 in main () at main.c:82

Я ожидаю, что в файл s_vb будут записаны все строки, считанные из файла vb.

...