0

让我们考虑一个场景,其中基于第一行数据从文件中读取一行作为结构返回,

并根据第一行数据更新文件内容,即第二行数据。

有两个函数可以独立工作,但是从读取函数返回结构后更新函数不起作用。

因此,更新函数中使用的两个文件的重命名和删除的返回值为 -1。如果没有返回 structre,或者换句话说,如果我们注释掉从文件中读取的数据,那么更新函数就可以正常工作,并且重命名和删除的返回值都是 0。

尽管这些功能彼此独立,但插入功能如何影响更新功能?

#include <stdio.h>
#include <stdlib.h>
struct structure
{
    int one;
    int second;
};
struct structure *read_row_from_file(int column_one_data);
void update_row_on_File(int column_one_data, int updated_value);
int main()
{
    struct structure *myInstance = read_row_from_file(3);
    update_row_on_File(3, 33);
    return 0;
}
struct structure *read_row_from_file(int column_one_data)
{
    struct structure *instance = malloc(sizeof(struct structure));
    int num_one, num_two;
    FILE *fp = fopen("example.txt", "r");
    while (fscanf(fp, "%d %d", &instance->one, &instance->second) != -1)
    {
        if (instance->one == column_one_data)
            return instance;
    }

    fclose(fp);
    return NULL;
}
void update_row_on_File(int column_one_data, int updated_value)
{
    int num_one, num_two;
    FILE *fp = fopen("example.txt", "r");
    FILE *fpc = fopen("example_copy.txt", "w");
    while (fscanf(fp, "%d %d", &num_one, &num_two) != -1)
    {
        if (num_one == column_one_data)
            fprintf(fpc, "%d %d\n", num_one, updated_value);
        else
            fprintf(fpc, "%d %d\n", num_one, num_two);
    }
    fclose(fp);
    fclose(fpc);
    int removeValue = remove("example.txt");
    int renameValue = rename("example_copy.txt", "example.txt");

    printf("\nremove value : %d | rename value: %d", removeValue, renameValue);
}

输出

删除值:-1 | 重命名值:-1

example.txt文件如下:

1 10
2 20
3 30
4 40
5 50
6 60

example_copy.txt文件如下:

1 10
2 20
3 33
4 40
5 50
6 60

所需的更新存在于example_copy.txt中;

但是没有删除example.txt并将example_copy.txt重命名为example.txt

4

1 回答 1

0

谢谢@Gerhardh 帮助我!

在读取时,if 条件文件中没有关闭。而是直接返回结构,使文件保持打开状态。

所需的更改是

struct structure *read_row_from_file(int column_one_data)
{
    struct structure *instance = malloc(sizeof(struct structure));
    int num_one, num_two;
    FILE *fp = fopen("example.txt", "r");
    while (fscanf(fp, "%d %d", &instance->one, &instance->second) != -1)
    {
        if (instance->one == column_one_data)
        {
            fclose(fp); // Close the file when if is true .
            return instance;
        }
    }

    fclose(fp);
    return NULL;
}
于 2021-10-25T09:33:42.807 回答