使用临时文件C在文本文件中编辑一行 [英] Editing a line in a text file using temp file C

查看:54
本文介绍了使用临时文件C在文本文件中编辑一行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编辑文本文件中的一行,但是在编辑文件时出现意外行为.我想做的是调整看起来像文本的特定行(点:100).在函数中,我按值传递要调整的新硬币和ftell-> user_point文件的偏移量的参数.我得到的输出结果很奇怪.我尝试使用编辑的行将文件的其余部分复制到临时文件,然后将其从我复制到临时文件的点复制回原始文件(即使用ftell的user_point偏移量).这是原始的国际剑联,上面有这样的条目:

I am trying to edit a line in a textfile but i have an unexpected behavior while i am editing the file. What i want to do is adjust a specific line (points : 100) of a text that looks like. In the function i pass arguments by value the new coins to be adjusted and the offset of the file with ftell->user_point. What i get as an output is weird. I try to copy the rest of the file to a temp,with an edited line, and then copy it back to the original file from the point that i copied to temp.(thats the user_point offset with ftell). Here is the original fie with entries like that:

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

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

What i get after 2nd edit run is:

...
    _______________________________________
    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 +" 模式,这也是我不想要的...

and so further edit will spoil the text... I also get an EXTRA \n at the end of the line which, at least what i think so, is due to "r+" mode which is something that i also dont want...

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 字符在我复制回原始文件时无法摆脱...预先感谢.

I have debugged the program and everything seems to work at least on what values are passed to the arrays where i store the line chars but i cant see why it ignores the \n of the previous line when i try to copy it back to the original... There seems to be a \r char that i cant get rid of while i copy back to the original... Thanks in advance.

推荐答案

我在考虑这样的事情:

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 e.g. "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);
}

它更短,更简单,或更有效(逐行循环而不是逐字符循环),并且您正在寻找的行可能在文件中的任何位置,而您不知道其确切位置.

It's shorter, simpler, maybe more effective (looping over line-by-line instead of char-by-char), and the line you are looking for can be anywhere in the file without you knowing its exact position.

这篇关于使用临时文件C在文本文件中编辑一行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆