Считывание слов из файла в массив
Есть файл, в котором на каждой строке записано по слову. Нужно считать их в массив. Количество слов и их длина заранее неизвестна. Компилируется с ошибками при выводе слов на экран. Что необходимо изменить? Вот фрагмент кода.
char** Startwords = (char**)malloc(sizeof(char*));
char** Startaddwords;
char* Startstring = (char*)malloc(sizeof(char));
char* Startaddstring;
char c;
int count = 0;
c = getc(Swords);
while (c != EOF)
{
count++;
int size = 1;
while (c != EOF)
{
Startaddstring = (char*)realloc(Startstring, size*sizeof(char));
if (Startaddstring != NULL)
{
Startstring = Startaddstring;
if (c != '\n')
{
Startstring[size - 1] = c;
c = getc(Swords);
size++;
}
else
{
Startstring[size - 1] = '\0';
break;
}
}
}
Startaddwords = (char**)realloc(Startwords, (count) * sizeof(char*));
if (Startaddwords != NULL)
{
Startwords = Startaddwords;
Startwords[count - 1] = Startstring;
Startstring = NULL;
c = getc(Swords);
}
}
Ответы (1 шт):
Автор решения: Maggot
→ Ссылка
Используйте fscanf - http://www.cplusplus.com/reference/cstdio/fscanf/
По теме алокации памяти для хранения - есть много дорог тут:
- указать максмум
- реалоцироваться в лоб каждый раз при добавлении
- реалацироваться по умному (прикапывая 5% от общего объема) но нужно заводить структуру и прикапывать это. и еще тьма вариантов
Вам выбирать какой дорогой идти
Вот пример в лоб:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int MAX_WORD = 512;
char* strdump(char* line) {
int alloc_size = strlen(line) + 1;
char* buf = (char*)malloc(alloc_size);
strncpy(buf, line, alloc_size);
buf[alloc_size - 1] = '\0';
return buf;
}
char** ReadFileWordByWord(FILE* _file) {
char buf[256];
char** arr = (char**)malloc(sizeof(char*) * MAX_WORD);
if (arr == NULL) {
return arr;
}
unsigned int index = 0;
while (fscanf(_file, "%255s", buf) == 1 && index < MAX_WORD) {
arr[index] = strdump(buf);
++index;
}
if (index < MAX_WORD) {
arr[index] = NULL;
}
return arr;
}
FILE* OpenFile(char* _filename) {
FILE* _file;
_file = fopen("data", "r");
if (_file == NULL) {
perror("Failed: ");
}
return _file;
}
void PrintAndClean(char** arr) {
unsigned int index = 0;
while (arr[index] != NULL && index < MAX_WORD) {
puts(arr[index]);
free(arr[index]);
++index;
}
free(arr);
}
int main() {
FILE* _file;
_file = OpenFile("data");
if (_file == NULL) {
return 1;
}
char** arr = ReadFileWordByWord(_file);
if (arr == NULL) {
return 2;
}
fclose(_file);
PrintAndClean(arr);
return 0;
}