Мне нужно создать динамический массив для хранения строк, которые я должен прочитать из трех файлов. Я новичок в C, и я не очень понимаю, как использовать указатели или выделить память. Я хотел бы знать, правильно ли я объявляю свой массив и правильны ли мои calloc()
вызовы. Формат файла, который я буду использовать:
word1
word2
word3 (and so on)
Я просто предполагаю, что слова из файлов не длиннее 50 символов (включая \0
).
В конце концов мне нужно будет отсортировать их, но мне нужно собрать их в массив, прежде чем я попробую это. Спасибо за любую помощь, которую вы можете оказать.
Вот что у меня есть ...
#include <stdlib.h>
#include <stdio.h>
int countWords(FILE *f){
int count = 0;
char ch;
while ((ch = fgetc(f)) != EOF){
if (ch == '\n')
count++;
}
return count;
}
int main(void){
int i;
int wordCount = 0;
int stringLen = 50;
FILE *inFile;
inFile = fopen("american0.txt", "r");
wordCount += countWords(inFile);
fclose(inFile);
inFile = fopen("american1.txt", "r");
wordCount += countWords(inFile);
fclose(inFile);
inFile = fopen("american2.txt", "r");
wordCount += countWords(inFile);
fclose(inFile);
printf("%d\n", wordCount);
char **wordList = (char **) calloc(wordCount, wordCount * sizeof(char));
for (i = 0; i < wordCount; i++){
wordList[i] = (char *) calloc(stringLen, stringLen * sizeof(char));
}
char ch;
int currentWord = 0;
int currentWordIndex = 0;
inFile = fopen("american0.txt", "r");
while ((ch = fgetc(inFile)) != EOF){
if (ch == '\n'){
currentWord++;
currentWordIndex = 0;
}
else
wordList[currentWord][currentWordIndex] = ch;
}
inFile = fopen("american1.txt", "r");
while ((ch = fgetc(inFile)) != EOF){
if (ch == '\n'){
currentWord++;
currentWordIndex = 0;
}
else
wordList[currentWord][currentWordIndex] = ch;
}
inFile = fopen("american2.txt", "r");
while ((ch = fgetc(inFile)) != EOF){
if (ch == '\n'){
currentWord++;
currentWordIndex = 0;
}
else
wordList[currentWord][currentWordIndex] = ch;
}
printf("%s\n", wordList[57]);
for (i = 0; i < wordCount; i++){
free(wordList[i]);}
free(wordList);
return 0;
}