テキストファイルの行を編集しようとしていますが、ファイルの編集中に予期しない動作が発生します。私がやりたいのは、次のようなテキストの特定の行(ポイント:100)を調整することです。関数では、引数を値で渡し、調整する新しいコインとファイルのオフセットをftell->user_pointで渡します。私が出力として得るものは奇妙です。ファイルの残りの部分を編集した行を使用してtempにコピーしてから、tempにコピーしたポイントから元のファイルにコピーして戻します(これは、ユーザーポイントがftellでオフセットされています)。次のようなエントリを持つ元のfieは次のとおりです。
...
_______________________________________
nickname : geo
password : cuvctq
Name : george
Surname : papas
points : 100
participated :
past draws : 0
Chosen No. :
future draws : 0
Registered : Sun Feb 05 19:23:50 2012
...
2回目の編集実行後に取得するものは次のとおりです。
...
_______________________________________
nickname : geo
password : cuvctq
Name : george
Surname : papaspoints : 98
participated :
past draws : 0
Chosen No. :
future draws : 0
Registered : Sun Feb 05 19:23:50 2012
...
At the end of the text i get one extra \n after i edit the
file whch is something i dont want :/
さらに編集するとテキストが台無しになります...行の最後に余分な\nが表示されますが、これは少なくとも私が思うに、"r+"
モードが原因であり、これも私が望んでいないことです...
void coins_adjust(int coins_new,int user_point)
{
int lines,i,ln_point_copy;
char buffer[50],buff_copied[50];
FILE *lottary,*temp;
memset(buff_copied,'\0',sizeof(char)*50);
lottary=fopen("customers.txt","r");
temp=fopen("temp.txt","w");
fseek(lottary,user_point,SEEK_SET);
for (lines=0;lines<5;lines++)
{
memset(buffer,'\0',sizeof(char)*50);
if (lines==5)
ln_point_copy=ftell(lottary); //from TEMP to CUSTOMERS
fgets (buffer ,50 , lottary);
}
coins_new+=atoi(buffer+15);
strncpy(buff_copied,buffer,15); //copy 15 chars and fill with null
memset(buffer,'\0',sizeof(char)*50);
itoa (coins_new,buffer,10); //fix the new line to be entered
strcat(buff_copied,buffer); //the edited line is as it is supposed
strcat(buff_copied,"\n"); //to be with \n at the end.
puts(buff_copied);
printf("%s",buff_copied);fflush(stdout);
fprintf(temp,"%s",buff_copied);
for(i=getc(lottary); i!=EOF; i=getc(lottary)) //copy to temp
{
putc(i, temp);
}
fclose(lottary);
fclose(temp);
temp=fopen("temp.txt","r");
lottary=fopen("customers.txt","r+");
fseek(lottary,ln_point_copy,SEEK_SET);
for(i=getc(temp); i!=EOF; i=getc(temp)) //copy until eof
{
putc(i, lottary);
}
fclose(lottary);fclose(temp);
}
プログラムをデバッグしましたが、少なくとも行文字を格納する配列に渡される値ですべてが機能しているようですが\n
、元の行にコピーして戻そうとすると、前の行のを無視する理由がわかりません。 。\r
元の文字にコピーしている間、削除できない文字があるようです...よろしくお願いします。