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