gpt4 book ai didi

c - 嵌套在for循环中的fprintf不写入第一个元素

转载 作者:行者123 更新时间:2023-11-30 16:31:52 25 4
gpt4 key购买 nike

描述

我正在尝试编写一个 csv 表 tablepath,我需要在其中包含变量的名称,这些变量位于文本文件 filepath 中。我使用第一个函数 read_parfilepath 检索名称,使用第二个函数 store 写入表中。

问题

创建的表系统地缺少文本文件中第一个变量的名称。 read_par 函数可以正常运行并产生预期的输出:一个包含变量名称的字符串,我还将其包含在上下文中。

文件路径

  • 以下是文本文件的结构:

par1
0 1 0.5
2杆
1 1 1
三杆
0 1 1
四杆
0 1 1
5杆
0 1 1
六杆
0 1 1

商店

  • 这是store函数:

    int store(int par_num, float sim_num, float **tab_param, char *filepath, char *tablepath){

    int j;
    char *name = NULL;
    FILE* sim_table = NULL;
    sim_table = fopen(tablepath, "w");

    // Start the first line in the table
    fprintf(sim_table,"simulation_number");

    for(j=1; j < par_num+1; j++){

    // If it is the last parameter -> create a new line
    if(j == par_num){

    name = read_name(j, filepath);
    fprintf(sim_table,",%s\n", name);
    }else{
    /* If it is not the last parameter -> continue writing on
    * the same line */
    name = read_name(j, filepath);
    fprintf(sim_table,",%s", name);
    }
    }
    fclose(sim_table);
    return 0;
    }

读取名称

  • 这是read_name函数:

    char *strtok(char *line, char *eof);    

    char *read_name(int par_id, char *filepath){

    char *par_name;
    int count = 0;

    FILE *file = fopen(filepath, "r");

    if ( file != NULL ){

    char line[256]; /* or other suitable maximum line size */
    while (fgets(line, sizeof line, file) != NULL){ /* read a line */

    if (count == (2*par_id)-2){

    // strtok removes the \n character from the string line
    strtok(line, "\n");
    par_name = line;

    fclose(file);
    }
    else{
    count++;
    }
    }
    }
    else
    {
    printf("\n\n ERROR IN FUNCTION READ_PAR\n\nTEXT FILE IS EMPTY\n\n");
    }
    return par_name;
    }

表路径

我获得的表格如下所示:

┌─────────────────┬┬────┬────┬────┬────┬────┐
│simulation_number││par2│par3│par4│par5│par6│
└─────────────────┴┴────┴────┴────┴────┴────┘

缺少 par1 名称,但所有其他变量名称均已成功打印。我不知道问题出在哪里。这是 for 循环条件的问题还是与 par1 字符串本身有关?

感谢您对此提供的任何帮助。

最佳答案

问题是 read_name 返回局部变量的地址 (line)。当函数返回时,该局部变量超出范围(并且从技术上讲不再存在)。因此,使用返回的指针会导致 undefined behavior .

为了更清楚地看到问题,这是 read_name 的简化版本,仅显示相关行:

char *read_name(int par_id, char *filepath){

char *par_name;

char line[256]; // line is a local variable
while (fgets(line, sizeof line, file) != NULL){

par_name = line; // par_name now points to the local variable
}
}
return par_name; // returning the address of the local variable
}

在该问题下的评论中指出,read_name 已经过测试并被发现可以正常工作。那么怎么会出错呢?这是 C 中未定义行为的最糟糕的事情。有时,代码在测试期间似乎可以工作,即使它在技术上是不正确的。我所说的技术上不正确是指它在某个时候崩溃。例如,在 store 函数中,如果您在对 read_name 的调用和对 fprintf 的调用之间添加另一个函数调用,则很有可能name 将被损坏,并且无法正确打印。

在这种情况下,一个简单的解决方案是使用 static 关键字声明 line:

static char line[256];

这样,line 具有静态存储持续时间,这意味着它在 read_name 返回后将继续存在。

关于c - 嵌套在for循环中的fprintf不写入第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50398180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com