我有一个问题,我必须将一个由264064字组成的文本文件读入缓冲区,然后在单独的数组中创建一个字指针数组。我不知道如何创建指向缓冲区中不同字符数量的字指针数组。关于如何解决这个问题的任何提示?
#include <stdlib.h>
#include <string.h>
int main()
{
int i,wordCount=0;
long bufsize;
char ch;
//Open File and get number of lines in file
FILE *fp = fopen("words2.txt", "r");
if (fp == NULL) {
printf("Error!");
exit(1);
}
do {
ch = fgetc(fp);
if (ch == '\n')
{
wordCount++;
}
} while (ch != EOF);
fclose(fp);
printf("%d\n",wordCount);
//Reading Words into buffer rawtext
char *rawtext;
fp = fopen("words2.txt", "rb");
if (fp != NULL)
{
if (fseek(fp, 0L, SEEK_END) == 0) {
bufsize = ftell(fp);
if (bufsize == -1) {
exit(1);
}
rawtext = malloc(sizeof(char) * (bufsize + 1));
if (fseek(fp, 0L, SEEK_SET) != 0) { exit(1); }
size_t newLen = fread(rawtext, sizeof(char), bufsize, fp);
if (ferror(fp) != 0) {
fputs("Error reading file", stderr);
} else {
rawtext[newLen++] = '\0';
}
}
//Print out buffer
printf("%s",rawtext);
fclose(fp);
free(rawtext);//Free allocated memory
char *ptr[wordCount];//Array for word-pointers
}
}
答案 0 :(得分:1)
如果保留rawtext
(即不要释放它),可以使用strchr('\n')
浏览内容,将数据存储到当前位置,检测每个新行char,终止在这个新行字符处的字符串,然后继续。因此,你的ptr
- 数组将指向最后rawtext
内的每个单词(这就是你不应该释放rawtext
的原因,因为指针会指向无效的内存): / p>
以下代码应该有效:
char* currWord = rawtext;
int nrOfWords = 0;
char* newlinePos;
while ((newlinePos = strchr(currWord,'\n')) != NULL) {
*newlinePos = '\0';
ptr[nrOfWords++] = currWord;
currWord = newlinePos + 1;
}
if (*currWord) {
ptr[nrOfWords++] = currWord;
}
旁注:表达式char *ptr[wordCount]
可能会将指针数组放在堆栈上,堆栈空间有限,至少小于堆。如果您的文件包含大量单词,则可能会出现问题。使用char *ptr = malloc((wordCount+1) * sizeof(char*))
保留堆上的内存。另请注意wordCount之后的+1
,表示最后一个单词未被新行终止。