【问题标题】:Assign values to variable in c programming using a file使用文件为c编程中的变量赋值
【发布时间】:2014-07-21 01:48:21
【问题描述】:

我想从一个 .txt 文件中读取多个变量。

例如,下面的代码将为 Txx、ST、mu、R0、DC 和 NB 赋值。

void main() {

    int Txx = 10;                       
    double ST = 0.07;                       
    double mu = 0.02;                       

    double R0 = 10e-6;                      
    double DC = 40e-6;                      
    int NB = 5;                     

}

相反,有没有一种方法可以使用单个文本文件来分配这些值,如下所示:


Txx = 10;                       
ST = 0.07;                      
mu = 0.02;                      
R0 = 10e-6;                     
DC = 40e-6;                     
NB = 5; 

这可能是一个常见问题。如果您将我重定向到解决方案。这将非常有帮助。

谢谢。

【问题讨论】:

  • C 中没有内置的解决方案。您可以编写自己的代码来执行此操作,也可以在 Google 上搜索“配置文件解析器”等。目前,使用 JSON 很流行。
  • 您希望能够更改文本文件,重新运行可执行文件并获得不同的结果吗?如果文本文件包含对不在代码中的变量的赋值(例如AB = 7;),会发生什么?
  • @MattMcNabb 谢谢,我会检查 JSON。
  • @Beta - 是的,这正是我想要做的。用户将确保只有分配的变量在文本文件中。

标签: c fgets scanf


【解决方案1】:
#include <stdio.h>
#include <string.h>

enum Type { INT, DOUBLE };

struct var {
    char *name;
    void *pointer;
    enum Type type;
};

int search(struct var *vars, const char *name){
    int i;
    for(i=0; vars[i].name ; ++i){
        if(strcmp(vars[i].name, name)==0)
            return i;
    }
    return -1;//not found
}

int main(void){
    int Txx, NB;
    double ST, mu, R0, DC;
    struct var vars[] = {
        {"Txx", &Txx, INT},
        {"NB", &NB, INT},
        {"ST", &ST, DOUBLE},
        {"mu", &mu, DOUBLE},
        {"R0", &R0, DOUBLE},
        {"DC", &DC, DOUBLE},
        {NULL, NULL, 0}
    };
    FILE *fp = fopen("data.txt", "r");
    char buff[128];
    int i;

    while(1==fscanf(fp, "%s", buff)){
        if(-1!=(i=search(vars, buff))){
            if(vars[i].type == INT)
                fscanf(fp, " %*c %d;", (int*)vars[i].pointer);
            else if(vars[i].type == DOUBLE)
                fscanf(fp, " %*c %lf;", (double*)vars[i].pointer);
        }
    }
    fclose(fp);
    printf("Txx = %d\n", Txx);
    printf("ST  = %f\n", ST);
    printf("mu  = %f\n", mu);
    printf("R0  = %e\n", R0);
    printf("DC  = %e\n", DC);
    printf("NB  = %d\n", NB);
    return 0;
}

【讨论】:

    【解决方案2】:

    粗鲁,但有效:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
      int Txx, NB;
      float ST, mu, R0, DC;
    
      FILE *fp = fopen("single.txt", "r");
    
      char varname[60];
      char c;
    
      while(fscanf(fp, "%s %c", varname, &c) != EOF)
        {
          if(strcmp(varname, "Txx")==0)
            fscanf(fp, "%d%c", &Txx, &c);
          if(strcmp(varname, "ST")==0)
            fscanf(fp, "%f%c", &ST, &c);
          if(strcmp(varname, "mu")==0)
            fscanf(fp, "%f%c", &mu, &c);
          if(strcmp(varname, "R0")==0)
            fscanf(fp, "%f%c", &R0, &c);
          if(strcmp(varname, "DC")==0)
            fscanf(fp, "%f%c", &DC, &c);
          if(strcmp(varname, "NB")==0)
            fscanf(fp, "%d%c", &NB, &c);
        }
    
      printf("Txx %d\n", Txx);
      printf("ST %f\n", ST);
      printf("mu %f\n", mu);
      printf("R0 %f\n", R0);
      printf("DC %f\n", DC);
      printf("NB %d\n", NB);
      return(0);
    }
    

    【讨论】:

      【解决方案3】:

      您可以做的一件事是使用文件流加载文本文件并解析该文件中的文本
      正如他们中的大多数人所说,使用 Json 将是一个非常好的主意,如果您正在查看什么是 json 以及如何在开始使用之前对其进行验证:

      要将上面的列表创建为 json,您只需这样做:

      {
        "Txx" : 10,                       
        "ST" : 0.07,                      
        "mu" : 0.02,                      
        "R0" : 10e-6,                     
        "DC" : 40e-6,                     
        "NB" : 5 
      }
      

      [http://json.parser.online.fr/][1]

      这将验证您的 Json 文件。

      【讨论】:

      • OP 询问了 C。此外,使用文件结尾作为循环条件在两种语言中都是错误的,因为在您已经尝试过之前可能不会设置文件结尾指示符读取超出文件末尾。
      • 谢谢,但我需要 C 语言的解决方案。
      • 读取文件似乎不是OP的问题;它是“有没有办法分配这些值”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      相关资源
      最近更新 更多