Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何读取文件和分隔值_C_String_File Io_Replace_Readfile - Fatal编程技术网

C 如何读取文件和分隔值

C 如何读取文件和分隔值,c,string,file-io,replace,readfile,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 阅读后没有问题,但我不能分开价格 这是我的职责: void s

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

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
阅读后没有问题,但我不能分开价格

这是我的职责:

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

那么我如何分离这些值呢???

您不能像这样分配给数组

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];
这可能是错误的,这取决于您如何声明值。

请在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;
}

我试过了,但有一个错误:`Segmentation Fault:11`@Teo我没有看到任何值的声明。启用编译警告,如果没有启用警告,代码中会有很多小错误,编译时不会出现问题。是的,我从main传递它,因此声明为:char values[20][30],我将token'声明为'char*,因此需要删除char str[20][30];这令人困惑。有很多原因可能导致分割错误。好的,但是我如何理解原因??我删除了它。。对不起,我对C不太在行
#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;
}