尝试替换文件中的单词时出现奇怪的故障
Odd glitches occurring when trying to replace word in a file
这个问题分为 3 个部分:“想法”、“假设”和“代码 MRE ',这样你就可以帮助我清楚、快速、最轻松地指出我的愚蠢行为,而且因为按频率降序排列,大多数错误在于算法、实施过程中所做的假设以及实际中的假设代码。
想法:
- 解析文件,在每个空白 space 字符处(
' ' or '\t' or '\n' or '[=11=]'
,递增 i
并将空白 space 字符存储在一个 int arr EOW[i]
(这样连 [=14=]
都可以读)。
- 倒回
FILE *
。 int q =1;
- for int
q
< i
:
fscanf()
每个单词(单词 = 由空白 space 个字符分隔的字符序列)并存储到 buffer[]
.
- if
strcmp(buffer, target)==0
则 strcpy(buffer, replacement)
.
fprintf()
缓冲区紧接着 EOW[q]
处的字符到临时文件。
- 删除原始文件并重命名临时文件。
假设:
fscanf(%s)
将扫描并存储字符,直到遇到 ' '
、'\t'
、'\n'
和 '[=29=]'
个字符。
char
当存储到 int
arr 时存储为它的 ASCII val,而 int
arr 的元素当存储到 char
时存储为其 ASCII 字符。
- 计数器
i
和 q
的用法和递增以及访问数组元素的用法是正确的,即使有点扭曲。
代码M.R.E:
int main(){
char frep[261]; getf scanf("%260[^\n]",frep);eat(); // stores fname in frep[], clears stdin
FILE * rep = fopen(frep,"r");FILE * tmp = fopen("Temp.Ctt","w");// opens file for reading and tmp for writing
if(rep==NULL||tmp==NULL){
perror("\nError ");fclose(rep);fclose(tmp);
}
else{
char target[501]; printf("\n Target : "); scanf("%500s",target);eat(); // gets target word
char replace[501]; printf("\n Replacement : "); scanf("%500[^\n]",replace);eat();// gets its replacement
char buffer[501]; long long i=0; int EOW[100000];
while(1){
char ch = fgetc(rep);
if(ch==EOF)
break; // breaks loop if EOF reached
else if(ch==' '||ch=='\t'||ch=='\n'||ch == '[=10=]')
i++;EOW[i]=ch;
}
rewind(rep);
for(int q=1; q<i; q++){
fscanf(rep,"%500s",buffer);
if(strcmp(target,buffer)==0)
strcpy(buffer,replace);
fprintf(tmp,"%s%c",buffer,EOW[q]);
}
fclose(rep);fclose(tmp);
remove(frep); rename("Temp.Ctt",frep);
printf("\nSucess.\n\nReplaced any instances of \"%s\" with \"%s\".\n",target,replace);
}
return 0;
}
else if(ch==' '||ch=='\t'||ch=='\n'||ch == '[=10=]')
i++;EOW[i]=ch;
缺少 { ... }
大括号,导致 EOW[i]=ch;
落在 之外else if
。
for(int q=1; q<i; q++){
考虑到 EOW
的编号方式,使其成为 q <= i
否则它会跳过最后一个元素。
int EOW[100000];
不相关,但您可以将其设为 char EOW
,因为没有充分理由将其设为 int
。
这个问题分为 3 个部分:“想法”、“假设”和“代码 MRE ',这样你就可以帮助我清楚、快速、最轻松地指出我的愚蠢行为,而且因为按频率降序排列,大多数错误在于算法、实施过程中所做的假设以及实际中的假设代码。
想法:
- 解析文件,在每个空白 space 字符处(
' ' or '\t' or '\n' or '[=11=]'
,递增i
并将空白 space 字符存储在一个 int arrEOW[i]
(这样连[=14=]
都可以读)。 - 倒回
FILE *
。int q =1;
- for int
q
<i
: fscanf()
每个单词(单词 = 由空白 space 个字符分隔的字符序列)并存储到buffer[]
.- if
strcmp(buffer, target)==0
则strcpy(buffer, replacement)
. fprintf()
缓冲区紧接着EOW[q]
处的字符到临时文件。- 删除原始文件并重命名临时文件。
假设:
fscanf(%s)
将扫描并存储字符,直到遇到' '
、'\t'
、'\n'
和'[=29=]'
个字符。char
当存储到int
arr 时存储为它的 ASCII val,而int
arr 的元素当存储到char
时存储为其 ASCII 字符。- 计数器
i
和q
的用法和递增以及访问数组元素的用法是正确的,即使有点扭曲。
代码M.R.E:
int main(){
char frep[261]; getf scanf("%260[^\n]",frep);eat(); // stores fname in frep[], clears stdin
FILE * rep = fopen(frep,"r");FILE * tmp = fopen("Temp.Ctt","w");// opens file for reading and tmp for writing
if(rep==NULL||tmp==NULL){
perror("\nError ");fclose(rep);fclose(tmp);
}
else{
char target[501]; printf("\n Target : "); scanf("%500s",target);eat(); // gets target word
char replace[501]; printf("\n Replacement : "); scanf("%500[^\n]",replace);eat();// gets its replacement
char buffer[501]; long long i=0; int EOW[100000];
while(1){
char ch = fgetc(rep);
if(ch==EOF)
break; // breaks loop if EOF reached
else if(ch==' '||ch=='\t'||ch=='\n'||ch == '[=10=]')
i++;EOW[i]=ch;
}
rewind(rep);
for(int q=1; q<i; q++){
fscanf(rep,"%500s",buffer);
if(strcmp(target,buffer)==0)
strcpy(buffer,replace);
fprintf(tmp,"%s%c",buffer,EOW[q]);
}
fclose(rep);fclose(tmp);
remove(frep); rename("Temp.Ctt",frep);
printf("\nSucess.\n\nReplaced any instances of \"%s\" with \"%s\".\n",target,replace);
}
return 0;
}
else if(ch==' '||ch=='\t'||ch=='\n'||ch == '[=10=]')
i++;EOW[i]=ch;
缺少 { ... }
大括号,导致 EOW[i]=ch;
落在 之外else if
。
for(int q=1; q<i; q++){
考虑到 EOW
的编号方式,使其成为 q <= i
否则它会跳过最后一个元素。
int EOW[100000];
不相关,但您可以将其设为 char EOW
,因为没有充分理由将其设为 int
。