所以我有一些代码可以让用户在文本文件中随意写任何内容,这要归功于How do I write to a specific line of file in 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%s\n",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;
}
(对不起,我很匆忙)
答案 0 :(得分:0)
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 :(得分:0)
尝试更改do-while
循环,
while((a=fgetc(fp1))!=EOF)
fputc(a,fp2);
我想这会解决你的问题。
答案 2 :(得分:0)
1)正如你所说"如果它在第一行上,则在它之前创建一个新行"
要解决此问题,您必须优化fprintf(fc,"\n%s\n",t);
语句的使用。
将此fprintf(fc,"\n%s\n",t);
替换为以下代码。
if(count==0) //if its the first line to edit..
fprintf(fc,"%s\n",t) //watch closely,no '\n' before %s,This will copy wihtout creating new line at beginning of line or file.
else
fprintf(fc,"\n%s\n",t);
2)如果您输入多个单词,则您的语句scanf(" %s[^\n]",t);
将无法正常工作。 您已尝试同时使用ScanSet和%s fromat说明符。您应该只使用其中任何一个。
让我们了解一下代码片段: -
char t[16]="\0";
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]="\0";
scanf(" %15[^\n]",t);//here 15 is sizeof(array)-1. one left to accomadate '\0'.
printf("%s",t); //this will successfully output "abc efg" (if given)