使用临时文件C在文本文件中编辑一行

我正在尝试编辑文本文件中的一行但我在编辑文件时有一个意外的行为。 我想要做的是调整看起来像的文本的特定行(点数:100)。 在函数中,我通过值传递参数,要调整的新硬币和文件与ftell-> user_point的偏移量。 我得到的输出很奇怪。 我尝试将文件的其余部分复制到temp,使用已编辑的行,然后将其从我复制到temp的点复制回原始文件(这就是带有ftell的user_point偏移量)。 这是原始的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 ... 

我在第二次编辑运行后得到的是:

 ... _______________________________________ 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 :/ 

所以进一步的编辑将破坏文本…我还得到一个额外的EXTRA \ 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字符,我无法摆脱,而我复制回原来…提前谢谢。

我更想到这样的事情:

 void change_points(int new_points) { FILE *input = fopen("customers.txt", "r"); FILE *output = fopen("temp.txt", "w"); char buffer[256]; while (fgets(buffer, sizeof(buffer), input)) { /* Look for the correct line */ /* Can also use eg "if (strncmp(buffer, "points", 6) == 0)" * if it's at the start of the line */ if (strstr(buffer, "points") != NULL) { int old_points; sscanf(buffer, "%*s : %d ", &old_points); /* Format how you like it */ fprintf(output, "%-13s: %d\n", "points", new_points + old_points); } else fputs(buffer, output); } fclose(output); fclose(input); /* The file "temp.txt" now contains the modifeed text */ /* Copy either using "fgets"/"fputs", or using "fread"/"fwrite" */ input = fopen("temp.txt", "r"); output = fopen("customers.txt", "w"); while (fgets(buffer, sizeof(buffer), input)) fputs(buffer, output); fclose(output); fclose(input); } 

它更短,更简单,可能更有效(逐行循环而不是char-by-char),并且您要查找的行可以在文件中的任何位置,而无需您知道其确切位置。