【发布时间】:2017-07-10 02:19:40
【问题描述】:
我正在尝试从文件寄存器加载结构。当我尝试扫描一个字符时,我得到一个空格。文件寄存器的格式如下:
accountNumber(char 8) code(char 1) 余额(float 9位2decimals)
例子:
AAAA1111 C 500000,05
当我尝试获取该示例寄存器时,我得到:
AAAA1111 500000,05
typedef struct{
char accountNum[8];
char cod;
float balance;
}t_regMov;
void loadStruct(char *line,t_regMov *mov){
char *aux=line;
aux=strchr(line,'\n');
*aux='\0';
aux-=9;
sscanf(aux,"%f",&mov->balance);
aux-=1;
*aux='\0';
aux-=1;
sscanf(aux,"%c",&mov->cod);
aux-=1;
*aux='\0';
sscanf(line,"%s",mov->accountNum);
}
int main(){
FILE *movf=fopen("movements.txt","r+");
if(!movf)exit(1);
t_regMov mov;
char line[100];
fgets(line,sizeof(line),movf);
while(!feof(movf)){
loadStruct(line,&mov);
printf("%s %c %f\n",mov.accountNum,mov.cod,mov.balance)
fgets(line,sizeof(line),movf);
}
fclose(movf);
}
【问题讨论】:
-
char accountNum[8];-->char accountNum[8+1]; -
由于您知道确切的行格式,
sscanf()似乎有点过头了。我建议使用memcpy()和atof()去除您需要的位而不是sscanf()。在我从事的更大项目中,我已经用结构更丰富的东西和我可以使用的库替换了所有文本文件格式。例如XML 和 JSON。如果您需要更线性的东西,必须有一个好的 CSV 库可以使用?使用专业文本文件很容易导致维护混乱。 -
也可能
float不够准确。 -
"%c"-->" %c"(加空格)