无法从C中的文件中查找单词的频率

时间:2015-04-21 23:32:48

标签: c file frequency

我需要编写一个代码来打印给定文件中每个单词的频率。像“the”和“The”这样的单词将被视为两个不同的单词。到目前为止,我已经编写了一些代码,但是当我尝试运行程序时,命令提示符停止工作。我只是需要一些指导,并指出这个代码的最佳方向,或者我想被告知这个代码需要被放弃。我不是很擅长这一点,所以任何帮助都会非常感激。

#include <stdio.h>
#include <string.h>

#define FILE_NAME "input.txt"

struct word {
    char wordy[2000];
    int frequency;
} words;

int word_freq(const char *text, struct word words[]);

int main (void)
{
    char *text;
    FILE *fp = fopen(FILE_NAME, "r");
    fread(text, sizeof(text[0]), sizeof(text) / sizeof(text[0]), fp);
    struct word words[2000];
    int nword;
    int i;
    nword = word_freq(text, words);
    puts("\nWord frequency:");
    for(i = 0; i < nword; i++)
        printf(" %s: %d\n", words[i].wordy, words[i].frequency);
    return 0;
}

int word_freq(const char *text, struct word words[])
{
    char punctuation[] =" .,;:!?'\"";
    char *tempstr;
    char *pword; 
    int nword;
    int i;
    nword = 0;
    strcpy(tempstr, text);
    while (pword != NULL) {
        for(i = 0; i < nword; i++) {
            if (strcmp(pword, words[i].wordy) == 0)
            break;
        }
        if (i < nword)
            words[i].frequency++;
        else { 
            strcpy(words[nword].wordy, pword);
            words[nword].frequency= 1;
            nword++;
         }
         pword = strtok(NULL, punctuation);
    }
    return nword;
}

1 个答案:

答案 0 :(得分:1)

首先关闭所有:


char *text;
FILE *fp = fopen(FILE_NAME, "r");
fread(text, sizeof(text[0]), sizeof(text) / sizeof(text[0]), fp);

读取文件的4个字节,因为sizeof(text[0])为1而sizeof(text)可能为4(取决于指针大小)。您需要使用ftell()或其他方法来获取数据文件的实际大小,以便将其全部读入内存。

接下来,您将此信息存储到没有分配内存的指针中。 text需要使用malloc或以某种方式保存内存。这可能是导致程序无法工作的原因,只是为了开始。

还有许多其他问题,需要时间来解释它们:

  • 当您将内存放入tempstr
  • 时,如何使用strcpy来释放内存
  • 即使不是这样的情况,它也可能会立即复制整个文件,除非文件中有NULL个终止的字符串,它可能也是如此,所以也许这是可以的。
  • 如何比较nwords[i].wordy,即使它未初始化,因此也是垃圾。
  • 即使你的文件被正确读入内存,你看起来是pword,它是为你的循环计数器整体化的。

请提供帮助或向您的老师询问此问题,因为此代码严重损坏。