所以我有一些代码可以允许用户在文本文件中写任何他们想要的东西,这要归功于 如何在 c 中写入特定的文件行? ,但是我遇到了一个新的障碍,每当我写回文件时,最后一个单词的末尾总是会出现一个烦人的随机字符, 如果它在第一行上,则会在其之前创建一个新行。我知道这与文件副本有关,但我不知道在哪里,有人可以帮忙吗?
int main()
{
FILE *fp,*fc;
int lineNum;
int count=0;
int ch=0;
int edited=0;
char t[16];
fp=fopen("start.txt","r");
fc=fopen("end.txt","w");
if(fp==NULL||fc==NULL)
{
printf("nError...cannot open/create files");
return 1;
}
printf("nEnter Line Number Which You Want 2 edit: ");
scanf("%d",&lineNum);
while((ch=fgetc(fp))!=EOF)
{
if(ch=='n')
count++;
if(count==lineNum-1 && edited==0)
{
printf("nEnter input to store at line %d:",lineNum);
scanf(" %s[^n]",t);
fprintf(fc,"n%sn",t); /
edited=1;
while( (ch=fgetc(fp))!=EOF )
{
if(ch=='n')
break;
}
}
else
fprintf(fc,"%c",ch);
}
fclose(fp);
fclose(fc);
if(edited==1)
{
printf("nCongrates...Error Edited Successfully.");
FILE *fp1,*fp2;
char a;
system("cls");
fp1=fopen("end.txt","r");
if(fp1==NULL)
{
puts("This computer is terrible and won't open end");
exit(1);
}
fp2=fopen("start.txt","w");
if(fp2==NULL)
{
puts("Can't open start for some reason...");
fclose(fp1);
exit(1);
}
do
{
a=fgetc(fp1);
fputc(a,fp2);
}
while(a!=EOF);
fclose(fp1);
fclose(fp2);
getch();
}
else
printf("nLine Not Found");
return 0;
}
(对不起,我赶时间)
尝试更改do-while
循环,例如,
while((a=fgetc(fp1))!=EOF)
fputc(a,fp2);
我想它会解决你的问题。
do
{
a=fgetc(fp1);
fputc(a,fp2);
}
while(a!=EOF);
do-while 循环在执行循环主体后评估其条件。换句话说,此循环正在将 EOF 写入文件,这是您不应该做的。EOF实际上不是一个字符,它只是操作系统在完成文件读取时返回的东西。我不确定实际将EOF写入文件的最终结果是什么,但我敢猜测这就是导致您所说的"烦人的随机字符"的原因。
将循环反转为正常的 while 循环,如下所示,以便在写入任何内容之前检查 EOF:
while ((a=fgetc(fp1))!=EOF)
{
fputc(a,fp2);
}
1)正如你所说"如果它在第一行,则在它之前创建一个新行"
要解决此问题,您必须优化fprintf(fc,"n%sn",t);
语句的使用。
将此fprintf(fc,"n%sn",t);
替换为以下代码。
if(count==0) //if its the first line to edit..
fprintf(fc,"%sn",t) //watch closely,no 'n' before %s,This will copy wihtout creating new line at beginning of line or file.
else
fprintf(fc,"n%sn",t);
2)如果您输入多个单词,您的陈述scanf(" %s[^n]",t);
将无法正常工作。您已经尝试同时使用 ScanSet 和 %s fromat specifer。您应该只使用其中任何一个。
让我们用代码片段来理解:-
char t[16]=" ";
scanf(" %s[^n]",t); //Assume that you gave input "abc efg" from keyboard
printf("%s",t); // This will output only "abc" on moniter.
您应该将其更改为这样的东西:-
char t[16]=" ";
scanf(" %15[^n]",t);//here 15 is sizeof(array)-1. one left to accomadate ' '.
printf("%s",t); //this will successfully output "abc efg" (if given)