第一次迭代后我得到了奇怪的字符串。我怀疑它可能是因为字符串终止,但我不知道如何解决它。或者我可能以错误的方式使用malloc。
我很高兴任何提示。
#include <stdio.h>
#include <memory.h>
#include <malloc.h>
#include <ctype.h>
#include "file_reader.h"
/**
* Opens a text file and reads the file. The text of the file is stored
* in memory in blocks of size blockSize. The linked list with the text is
* returned by the function. Each block should contain only complete words.
* If a word is split by the end of the block, the last letters should be
* moved into the next text block. Each text block must be NULL-terminated.
* If the reading of the file fails, the program should return a meaningful
* error message.
*/
int getFileSize(FILE* file) {
FILE* endOfFile = file;
fseek(endOfFile, 0, SEEK_END);
long int size = ftell(file);
fseek(file, 0, SEEK_SET);
return (int) size;
}
LinkedList* read_text_file(const char* filename, int blockSize) {
int globalByteCounter = 0;
LinkedList* list = LinkedList_create();
int blockByteCounter;
FILE* fp = fopen(filename, "r");
int fileSize = getFileSize(fp);
char* tokPointer = malloc(sizeof(getc(fp)));
char* block = malloc(sizeof strcat("",""));
//Loop for blocks in list
while (globalByteCounter <= fileSize) {
blockByteCounter = 0;
char* word = malloc(sizeof(blockSize));
//loop for each block
while(blockByteCounter<blockSize) {
char tok;
//Building a word
do {
strcat(word, tokPointer);
tok = (char) getc(fp);
tokPointer=&tok;
blockByteCounter++;
}while (isalpha(tok));
//Does this word still fit the block?
if (blockByteCounter + strlen(word) < blockSize) {
strcat(block, word);
//Setze Wort zurück und füge Sonderzeicehen an
word = strcpy(word,tokPointer);
} else {
strcpy(block,word);
}
}
globalByteCounter += blockByteCounter;
LinkedList_append(list, block);
free(word);
}
LinkedList_append(list,block);
fclose(fp);
free(block);
free(tokPointer);
return list;
}
答案 0 :(得分:1)
代码存在多个问题。让我解决其中一些问题:
sizeof(getc(fp))
这与在sizeof
的返回类型上应用getc
相同。在你的情况下,你在这里做的是sizeof(int)
。那不是你想要的。
假设您有一个文本文件,您想要阅读的内容的大小是ASCII中的数字,那么您要找的是好的fscanf
。
在此类似:
strcat("","")
但实际上更糟糕。 strcat("a", "b")
不会返回"ab"
。它会尝试将"b"
连接到"a"
并返回a
的地址,这非常糟糕,因为它不仅没有做你想做的事情,而且还试图修改字符串"a"
。你不能修改字符串文字。
blockByteCounter
未初始化。
你的预感是正确的:
char* word = malloc(sizeof(blockSize));
如果您没有将word
初始化为空字符串,那么当您尝试将tokPointer
连接到其上时,您将运行一个未终结的字符串。不仅如此,tokPointer
还未初始化!
我也不确定您为什么要尝试使用strcat
来构建单词。你不需要所有这些指针。一旦知道缓冲区所需的大小,就可以1)只使用fscanf
来读取一个单词;或者2)使用fgetc
和一个好的旧简单计数器i
将每个字母放入缓冲区数组,然后在打印前用0
终止它。