检查文件中的重复单词

时间:2016-02-03 19:20:36

标签: c file printf scanf words

我想检查.txt文件中是否有任何重复项。我写了一段代码,但它没有运行。我不确定在norep.txt模式下打开"a+"文件。我的想法是将我的文字的第一个单词放在norep.txt文件中,然后将text.txt中的每个单词与norep.txt中的单词进行比较,并仅复制文件中我需要的单词

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fd;
    FILE *ft;
    char aux[30];
    char aux1[30];    
    int len;    

    fd = fopen("c:\\text.txt", "r");
    if (fd == NULL) {
        puts("Error");
    }

    ft = fopen("c:\\norep.txt", "a+");
    if (ft == NULL) {
        puts("Error");
    }

    fscanf(fd, "%s", aux);
    fprintf(ft, "%s", aux);
    rewind(fd);
    rewind(ft);
    while (!feof(fd)) {
        fscanf(fd, "%s", aux);

        while (!feof(ft)) {
            fscanf(ft, "%s", aux1);
            len = strcmp(aux, aux1);

            if (len != 0) {
                fprintf(ft, "%s", aux);
            }
        }
        rewind(ft);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您应该在回放之前刷新输出文件。

fflush - flush a streamfflush

当然,这不会解决您的问题,因为:

请注意,手册中会说明重新定位操作会被忽略,因此您的阅读尝试始终会找到文件结尾。

  

追加:打开文件末尾的输出文件。输出操作   总是在文件末尾写入数据,扩展它。重新定位   操作(fseek,fsetpos,rewind)被忽略。该文件已创建   如果它不存在。

您应该做的是创建一个内部存储器表,保存所有唯一条目,并在所有处理完成后将其写入新文件。当您阅读fd文件时,请检查列表并添加新条目(如果该条目尚未在列表中)。然后在完成fd处理之后,然后只写出你的列表。当然,根据数据文件的大小,这可能太大了。

您可以随时将每个唯一条目附加到输出文件中。但是你需要有一些方法来检查以前的条目而不用试图读取输出文件。

答案 1 :(得分:2)

通常的做法是逐字读取输入文件,以某种方式存储必要的信息,然后在读完文件中的所有信息后,将所需的输出写入输出文件。 / p>

这种方法的粗略骨架可能如下所示:

int main()
{
    const char *infile = "text.txt";
    const char *outfile = "norep.txt";

    FILE *in;
    FILE *out;

    char word[30];

    // (1) Read all words

    in = fopen(infile, "r");      // .. and enforce success

    while (fscanf(in, "%29s", word) == 1) {
        // store word somewhere
    }        
    fclose(in);

    // (2) Determine unique words somehow

    // (3) Write out unique words

    out = fopen(outfile, "w");    // .. and enforce success

    for (i = 0; i < nunique; i++) {
        fprintf(out, "%s\n", unique[i]);
    }        
    fclose(out);

    return 0;
}

这个不完整的骨架代码中缺少用于完成唯一单词的实际算法。

如果你真的想在不使用当前单词之外的额外内存的情况下测试文件中单词的唯一性,可以使用独立的文件指针打开输入文件两次。然后你可以像这样写一个循环:

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

int main()
{
    const char *infile = "text.txt";
    const char *outfile = "norep.txt";

    FILE *in1;
    FILE *in2;
    FILE *out;

    char word1[30];
    char word2[30];

    in1 = fopen(infile, "r");
    in2 = fopen(infile, "r");
    out = fopen(outfile, "w");

    if (in1 == NULL || in2 == NULL || out == NULL) {
        fprintf(stderr, "Could not open all required files.\n");
        exit(1);
    }

    while (fscanf(in1, "%29s", word1) == 1) {
        int count = 0;

        while (fscanf(in2, "%29s", word2) == 1) {
            if (strcmp(word1, word2) == 0) count++;
            if (count > 1) break;
        }

        if (count == 1) fprintf(out, "%s\n", word1);
        rewind(in2);
    }

    fclose(in1);
    fclose(in2);
    fclose(out);

    return 0;
}

当然,这将经常重新读取文件,因为文件中有文字。找不到Moby-Dick中独特单词的好方法。我建议你研究一下基于记忆的方法。