如何读取文件和单独的值

时间:2015-03-16 21:18:02

标签: c string file-io replace readfile

我试图读取这样的文件:

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

在等于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);    
}

那么如何分离这些值?

2 个答案:

答案 0 :(得分:0)

你不能像这样分配给数组

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

答案 1 :(得分:0)

在主要分开。
像这样:

#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;
}