C 中有类似 "Beginning of file" 的东西吗?

Is there anything like "Beginning of file" in C?

我需要制作一个 "text processor" 或 "translator"(一个非常小且基本的)。它的输入是一个包含任何文本的文本文件,我必须找到罗马数字并将它们替换为另一个词。例如,在本文中:

Hello I am a text sayIIng stVffI

输出应该是:

Hello REPLACED_WORD am a text sayIIng stVffI

意思是我只需要替换数字单词,而不是其中有数字的东西,例如 sayIIng。它有 II,但它不仅仅是 II,所以它没有 "translate"。

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

这些是验证数字与 text/sentence 的其余部分分开的函数。

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] == '[=11=]' || tk[0] == EOF){
        return 1;
    }
    return 0;
}

然后我有一个函数可以读取文件并尝试找到每次出现的事件(我仍然在尝试弄清楚如何用单词 replaces but first things first 来重写整个文本)。

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");
            }
        }

谢谢。

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

所以你需要读取一个输入文件,然后写一个输出文件(如果你想要一个替换文件的程序,也许 rename(2)-ing 到输入)。

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

要解析该行,您可以手动解析它(不使用 strtok),编码一个简单的 finite state automaton (if you wanted to, you could generate that automaton with flex, but that is overkill). Alternatively, consider using regex(3)(在您的情况下可能有点矫枉过正)

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

没有行首条件或字符。就是当aux == bufferaux是当前字符指针,buf是行缓冲区)

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