从文件中读取getc后,在C中获取奇怪的字符串

时间:2016-12-03 17:25:00

标签: c char malloc

第一次迭代后我得到了奇怪的字符串。我怀疑它可能是因为字符串终止,但我不知道如何解决它。或者我可能以错误的方式使用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;
}

1 个答案:

答案 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终止它。