【问题标题】:How Read File And Separate Values如何读取文件和分离值
【发布时间】:2015-03-16 21:18:01
【问题描述】:

我正在尝试读取这样的文件:

nInp=20
nOut=1
NLaye=3
hid=30
er=0.001
epo=100
epoRep=100
pscpa=0
tip=Aggr
net=emi
numPrec=0.25
prec=NH3;NOX;PM10;SO2;VOC
rag=4

我必须只读取= 之后的值,并且使用prec 的值,我必须用新行分隔每个值(用; 分隔),然后将它们写入新文件如:

NH3
NOX
PM10
SO2
VOC

在equals symbolt之后阅读没有问题,但我无法分隔price

这是我的功能:

void settaggiRete(char values[20][50]){
    char line[50]; 
    int i = 0, j = 0;
    char str[10][20];
    FILE *conf = fopen("conf.txt", "r");
    if(conf == NULL){
        printf("Impossibile apripre il file conf\n");
        exit(EXIT_FAILURE);
    }

    //Ciclo sulle linee del file di configurazione
    while(fgets(line, sizeof(line), configRete) != NULL){
//        Leggo i valori contenuti dopo =
        if(i==10){
            char * str = values[10];
            sscanf(line, "%*[^=]=%s", values[i]);
            while ((token = strsep(line, ";")) != NULL){
                str[j] = token; 
                j++;
            }
        }else{
            sscanf(line, "%*[^=]=%s", values[i]);
        }
        i++;
    }
    fclose(configRete);    
}

那么我该如何区分这些值呢?

【问题讨论】:

    标签: c string file-io replace readfile


    【解决方案1】:

    你不能像这样分配给数组

    str[j] = token;
    

    试试

    strcpy(str[j], token);
    

    虽然这样做很危险,所以你可以

    size_t length = strlen(token);
    if (length >= sizeof(str[j]))
        length = sizeof(str[j]) - 1;
    memcpy(str[j], token, length);
    str[j][length] = '\0';
    

    请注意,您编写安全代码的代价是修剪令牌,因此更好的方法是使用动态分配。

    你也在循环中重新声明了str,所以删除这一行

    char * str = values[10];
    

    这可能是错误的,具体取决于您声明 values 的方式。

    【讨论】:

    • 我试过了,但是出现了这个错误:` Segmentation Fault:11`
    • @Teo 我没有看到values 的任何声明。启用编译警告,如果你没有启用警告,你的代码中有很多小错误编译没有问题。
    • 是的,我从main() 传递它,所以声明是:char values[20][30],我声明了token' as 'char *
    • 所以你需要删除令人困惑的char str[20][30];。导致分段错误的原因有很多。
    • 好的,但是我怎么理解原因呢?我删除它..(对不起,我不太擅长 C)
    【解决方案2】:

    在 main 处分开。
    像这样:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void settaggiRete(char values[20][50]){
        char line[50]; 
        int i = 0;
        FILE *conf = fopen("conf.txt", "r");
        if(conf == NULL){
            printf("Impossibile apripre il file conf\n");
            exit(EXIT_FAILURE);
        }
    
        while(fgets(line, sizeof(line), conf) != NULL){
            sscanf(line, "%*[^=]=%49s", values[i++]);
        }
        fclose(conf);   
    }
    
    int main(void){
        char values[20][50] = {{0}};
        char *value11[25];
        int i, v11 = 0;
    
        settaggiRete(values);
        for(i=0;i<20;i++){
            if(!*values[i])
                break;
            if(i==11){
                char *token, *p = values[11];
                int j = 0;
                while(token = strsep(&p, ";")){
                    value11[v11++] = token;
                }
                for(j = 0; j < v11; ++j){
                    printf("values[11][%d]=%s\n", j, value11[j]);
                }
            } else {
                printf("values[%d]=%s\n", i, values[i]);
            }
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多