1

我有一个这样的txt文件:

"shoes":12
"pants":33
"jacket":26
"glasses":16
"t-shirt":182

我需要编辑夹克的数量(例如从 26 到 42)。所以,我写了这段代码,但我不知道如何编辑有“夹克”这个词的特定行:

#include <stdio.h>

int main() {
    char row[256];
    FILE *fp;

    if (!(fp=fopen("myfile.txt","rw"))) {
        printf("Error");
        return 1;
    }

    while (!feof(fp)){
        fgets(row, 256, fp);
        // if there is the "jacket" in this row, then edit the row
    }

    fclose (fp);
    return 0;
}
4

5 回答 5

5

不幸的是,没有简单的解决方案。

一种常见的方法是将所有行(修改或未修改)写入临时文件,然后将临时文件移动到现有文件上。

于 2012-04-19T09:29:16.113 回答
4

如果旧值和新值中的字符数相同(您的情况),您可以覆盖它们:

FILE* fp = fopen("x.txt", "r+"); // note: r+, not rw
char row[256];
char* string = "\"jacket\":"; // note: contains punctuation
char* newvalue = "42\n"; // note: contains a line break

while (!feof(fp)) // note: feof is bad style
{
    long pos = ftell(fp);
    fgets(row, 256, fp); // note: might add error handling

    // check if there is the "jacket": in this row,
    if (strncmp(row, string, strlen(string)) == 0)
    {
        // check that the old length is exactly the same as the new length
        // note: assumes the row contains a line-break \n
        if (strlen(row) == strlen(string) + strlen(newvalue))
        {
            // then edit the row
            fseek(fp, (long)(pos + strlen(string)), SEEK_SET);
            fputs(newvalue, fp);
            fseek(fp, (long)(pos + strlen(string) + strlen(newvalue)), SEEK_SET);
        }
        else
        {
            printf("Too bad, cannot change value");
        }
    }
}
fclose(fp);

您可能希望更改文件格式以包含填充,例如:

"shoes":12____
"pants":33____
"jacket":26____
"glasses":16____
"t-shirt":182___

这里_可视化一个空格字符;此文件格式最多支持 999999 个项目。如果你做这样的改变,你需要改变上面的代码来检查和调整空格的数量等。

于 2012-04-19T10:48:43.930 回答
0

编写脚本并使用 sed(流编辑器)编辑特定流。

于 2012-04-19T09:52:56.893 回答
0

使用 gawk 可能更容易。

gawk -f edit_row.awk <myfile.txt >tmp.txt && mv tmp.txt myfile.txt

编辑行.awk

BEGIN {
    FS = ":"
}

{
    if ($1 == "\"jacket\"") {
        print $1 ":" 42
    } else {
        print
    }
}

如果您真的想在 c 中执行此操作,可以使用 tmpfile() 函数。

#include <stdio.h>
#include <string.h>

int main() {
    char row[256];
    char *file_name = "myfile.txt";
    FILE *file_pointer;
    FILE *temp_file;

    char col_a[101] = "";
    unsigned int col_b = 0;
    char filter[] = "\"jacket\"";
    size_t filter_length = sizeof(filter) - 1;

    file_pointer=fopen(file_name,"r+");
    temp_file=tmpfile();

    while (fgets(row, 256, file_pointer) != NULL) {
        if (strncmp(row, filter, filter_length) == 0) {
            fprintf(temp_file,"%s:46\n", filter);
        } else {
            fprintf(temp_file, "%s", row);
        }
    }


    rewind(temp_file);
    rewind(file_pointer);

    while (fgets(row, 256, temp_file) != NULL) {
        fputs(row, file_pointer);
    };

    fclose(file_pointer);
    fclose(temp_file);
    return 0;
}
于 2012-04-19T11:41:32.237 回答
0

文本文件不像数据库,我们可以一次性修改单行或单列,在 c/c++ 中也很难以重复编码为代价。

于 2012-04-19T09:40:53.853 回答