是否有类似"文件的开头"在C?

时间:2015-04-16 05:01:19

标签: c text processor

我需要制作一个“文本处理器”或“翻译器”(非常小而且基本的)。它的输入是一个包含任何文本的文本文件,我必须找到罗马数字并用另一个单词替换它们。例如,在本文中:

  

你好我是一个文字sayIIng stVffI

输出应为:

  

Hello REPLACED_WORD是一个文字sayIIng stVffI

含义我只需要替换数字,而不是替换数字的东西,例如sayIIng。它有II,但它不仅仅是II,所以它不会“翻译”它。

我正在使用fgets()来读取文件,然后使用strtok()来分隔每行的单词,并使用strpbrk()来查找某些字符串的每个出现在另一行中。我的问题是,如果我在文本文件的第一个字母中有一个正确的罗马数字,它不会识别它,因为条件是数字有空格,或者之前是\ n或者\ t或NULL。 ..而且似乎这些都不在文本文件中的数字之前。

这些功能可以验证数字与文本/句子的其余部分是分开的。

int validate_before(char *token){
    char *tk = token-1;
    if(tk[0] == ' ' || tk[0] == '\t' || tk[0] == '\n' || tk[0] == 'NULL'){
        return 1;
    }
    return 0;
}

int validate_after(char *token){
    char *tk = token+1;
    if(tk[0] == ' ' || tk[0] == '\t' || tk[0] == '\0' || tk[0] == EOF){
        return 1;
    }
    return 0;
}

然后我有一个函数读取文件并尝试查找每个出现的事情(我仍然试图弄清楚如何重写整个文本,但首先是替换,但首先是第一件事。)

while(fgets(buffer, 1024, archivo_entrada)){
            aux = strtok(buffer, "\n");
            while(aux != NULL){
                char *primera = strpbrk(aux, "I");

                printf("%s @@ \n", aux);
                while(primera != NULL){
                    if(primera && (validate_before(primera) == 1) && (validate_after(primera) == 1)){
                        printf("--FOUND AN "I"--\n");
                    }
                    primera = strpbrk(primera+1, "I");
                }
             aux = strtok(NULL, "\n");
            }
        }

感谢。

1 个答案:

答案 0 :(得分:0)

首先,你不能就地工作,因为文件是只能附加或截断的字节序列(在它们的末尾) - 没有基本的方法来替换内部序列(在某些文件的内部,而不是在末尾)字节由另一个(不同大小)。

所以你需要读取一个输入文件,并编写一个输出文件(如果你想要一个替换文件的程序,可能会rename(2) - 输入它。)

所以你可能想逐行处理输入文件;使用fgets(如果您接受限制最宽行的固定行缓冲区)或使用getline(3),至少在POSIX系统上(它可以接受适合内存的任意长行)

要解析该行,您可以手动解析(不使用strtok),编码一个简单的finite state automaton(如果您愿意,可以使用flex生成该自动机,但这太过分了)。或者,考虑使用regex(3)(在您的情况下可能是矫枉过正)

顺便说一句,文件开头(不是行)条件是ftell(3),只是ftell( 文件 ) == 0L

没有行条件或字符的开头。就在aux == bufferaux是当前字符指针,而buf是行缓冲区)时

请注意strtok(3)是有状态的。如果你坚持使用它,你应该通过第一次(在行开头)传递非NULL缓冲区并在其他时间传递NULL来重置它