Я бы хотел отсортировать словарь из файла и сначала записать его в другой файл. Во время процесса он всегда будет зависать, когда программа записывает строку в строку 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.