我需要制作一个“文本处理器”或“翻译器”(非常小而且基本的)。它的输入是一个包含任何文本的文本文件,我必须找到罗马数字并用另一个单词替换它们。例如,在本文中:
你好我是一个文字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");
}
}
感谢。
答案 0 :(得分:0)
首先,你不能就地工作,因为文件是只能附加或截断的字节序列(在它们的末尾) - 没有基本的方法来替换内部序列(在某些文件的内部,而不是在末尾)字节由另一个(不同大小)。
所以你需要读取一个输入文件,并编写一个输出文件(如果你想要一个替换文件的程序,可能会rename(2) - 输入它。)
所以你可能想逐行处理输入文件;使用fgets
(如果您接受限制最宽行的固定行缓冲区)或使用getline(3),至少在POSIX系统上(它可以接受适合内存的任意长行)
要解析该行,您可以手动解析(不使用strtok
),编码一个简单的finite state automaton(如果您愿意,可以使用flex生成该自动机,但这太过分了)。或者,考虑使用regex(3)(在您的情况下可能是矫枉过正)
顺便说一句,文件开头(不是行)条件是ftell(3),只是ftell(
文件 ) == 0L
没有行条件或字符的开头。就在aux == buffer
(aux
是当前字符指针,而buf
是行缓冲区)时
请注意strtok(3)是有状态的。如果你坚持使用它,你应该通过第一次(在行开头)传递非NULL
缓冲区并在其他时间传递NULL
来重置它