c - 读取“;”之间的字符串 在 C 中的 .txt 文件中
问题描述
更新:谢谢大家!你们非常有帮助,非常感谢大家!我必须从 .txt 文件中读取数据并将它们放入 B 树中。问题是:我无法从文件中读取数据。“;”之间的每个数据 必须存储在不同的变量中,以便我可以在用户显示时显示它。成语是葡萄牙语,但我希望你能理解。更新 - 到目前为止的代码:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
struct veiculos
{
int lote;
char placa[50];
char uf[10];
char motor[50];
int renavam;
char chassi[100];
int ano;
char marca[100];
char proprietario[100];
char financeira[100];
float valor;
};
typedef struct veiculos veiculos;
int main()
{
veiculos a[100];
char ch[100];
int i=0,x=0,caractere;
FILE *fp = fopen("ListadeVeiculosLeilao.txt","r");
for(i=0; i<100; i++)
{
fscanf(fp, " %[^;];", ch);
a[i].lote = atoi(ch);
fscanf(fp, " %[^;];", a[i].placa);
fscanf(fp, " %[^;];", a[i].uf);
fscanf(fp, " %[^;];", a[i].motor);
fscanf(fp, " %[^;];", ch);
a[i].renavam = atoi(ch);
fscanf(fp, " %[^;];", a[i].chassi);
fscanf(fp, " %[^;];", ch);
a[i].ano = atoi(ch);
fscanf(fp, " %[^;];", a[i].marca);
fscanf(fp, " %[^;];", a[i].proprietario);
fscanf(fp, " %[^;];", a[i].financeira);
fscanf(fp, " %[^\n]\n", ch);
a[i].valor = atof(ch);
for(x=0;x<strlen(a[i].marca);x++){
caractere = a[i].marca[x];
if(caractere==10)a[i].marca[x]=' ';
}
for(x=0;x<strlen(a[i].proprietario);x++){
caractere = a[i].proprietario[x];
if(caractere==10)a[i].proprietario[x]=' ';
}
for(x=0;x<strlen(a[i].financeira);x++){
caractere = a[i].financeira[x];
if(caractere==10)a[i].financeira[x]=' ';
}
}
for(i=1; i<82; i++)
{
printf("%d\n",a[i].lote);
printf("%s\n",a[i].placa);
printf("%s\n",a[i].uf);
printf("%s\n",a[i].motor);
printf("%d\n",a[i].renavam);
printf("%s\n",a[i].chassi);
printf("%d\n",a[i].ano);
printf("%s\n",a[i].marca);
printf("%s\n",a[i].proprietario);
printf("%s\n",a[i].financeira);
printf("%.2f\n\n",a[i].valor);
printf("--------------------\n\n");
}
fclose(fp);
return 0;
}
这是文件:
Lote; Placa; UF; Motor; Renavam; Chassi; Ano; Marca/ Modelo;
Proprietário; Financeira; Valor
0001; LJG6509; DF; BA042893; 00300896778; 7SK182224; 1974;
VW/BRASILIA; GONCALO JOSE DE FRANCA; MARCAL DE ASSIS BRASIL; 3000.00
0002; HBR7108; DF; 9BD17206G83400203; 00954371330; 178F1011*8002263*;
2008; FIAT/SIENA FIRE FLEX; ANTONIO AUGUSTO ALVES DOS SANTOS; AYMORE
FINANCIAMENTOS;3450.00
0003; JJB0059; DF; 9BD17201B53124230; 00838026320; 178E9011*6128825*;
2004; FIAT/SIENA ELX FLEX; JOAO ALBERTO SANTOS SOBRINHO; BANCO
BRADESCO FINANCIAMENTOS S.A. ; 3450.00
0004; JGG0484; DF; 93HGD17404Z120657; 00824912748; L13A4-H113508;
2004; HONDA/FIT LX; FERNANDO EVARISTO DOS SANTOS; BANCO FINASA SA;
3030.00
0005; LJQ8142; RJ; LB8ABK60592; 00304920886; SUPRIMIDO; 1983; FORD/DEL
REY; JOSE SIQUEIRA; AYMORE LEASING; 3150.00
0006; JDQ0675; DF; 9BG5TC11UFC158987; 00293715343; 5JH20PA48199; 1985;
GM/CHEVETTE; RODRIGO DE CASTRO PAULA; AYMORE FINANCIAMENTOS; 3530.00
0007; JGQ8447; DF; 9BFZF10B678103244; 00889829691; CAJA78103244; 2006;
FORD/FIESTA; ANDREA CRISTINA CHAVES MACHADO; BANCO ITAUCARD SA;
3100.00
0008; JDS8539; GO; BA170068; 00001269992; SUPRIMIDO; 1975;
VW/BRASILIA; SAMUEL SOARES SARAFIM; BV FINANCEIRA SA CFI; 2850.00
0009; JFT5423; DF; 9BGSD19401C189366; 00751983616; CJ0039685; 2000;
GM/CORSA SUPER; ELOI NUNES DE SOUSA; PANAMERICANO; 3550.00
0010; JJD1340; DF; 9BD178237T0079169; 00663876648; 4777947; 1996;
FIAT/PALIO EL; LEANDRO DANTAS LIMA; BANCO PANAMERICANO SA; 3450.00
0011; KDR1120; DF; 9BGLK19BRRB315479; 00627287034; C20NE31014740L;
1994; GM/VECTRA GLS; MAURICIO DE LIMA SILVA; HSBC BANK BRASIL S/A BM;
2480.00
0012; KAW6325; GO; LB4DPA78820; 00112493793; SUPRIMIDO; 1975;
FORD/CORCEL; LEVINO MACHADO DA COSTA; BANCO PANAMERICANO SA; 1880.00
0013; JEQ3930; DF; BS012252; 00000121967; BH136193; 1970; VW/FUSCA
1500; SILVANA APARECIDA DA SILVA; UNIBANCO - UNIAO DE BANCOS
BRASILEIROS S.A.; 1850.00
0014; HYS6690; CE; 9BGRD48X04G134684; 00818350288; 7V0009127; 2003;
GM/CELTA 5 PORTAS; SIMONE QUINTINO MENDES DA VITORIA; BANCO GMAC;
3500.00
0015; JGA2435; DF; 9BGSC68Z01B167794; 00759527709; SUPRIMIDO; 2001;
GM/CORSA WIND; CLEUSA DO ROSARIO A SIQUEIRA; AYMORE FINANCIAMENTOS;
3100.00
0301; JHH8778; DF; 8BCLDRFJ48G521910; 00939636573; SUPRIMIDO; 2007;
I/CITROEN C4 PALLAS20GLM; CRISTIANE MONTEIRO LIMA PAIVA; CAIXA
ECONÔMICA FEDERAL; 2000.00
0302; JKJ5612; DF; 9BWAA05W5DP091431; 00500162247; CCP396671; 2012;
VW/GOL 1.0 ECOMOTION GIV; ANTONIO ALVES DE OLIVEIRA; BANCO
PANAMERICANO SA; 2500.00
0303; JHY8370; DF; 8AGCN48X0BR142232; 00253254264; U55060355; 2010;
I/CHEVROLET AGILE LTZ; N.A PIZZARIA RESTAURANTE E SERVICOS DE B; BB
ADMNISTRADORA DE CONSC SA; 3500.00
0304; LNN3808; DF; 93UMA48L714010797; 00766868516; AKL734422; 2001;
AUDI/A3 1.6; ALEX ANTONIO DA SILVA; BANCO BRADESCO SA; 2000.00
0305; LOM1229; DF; 9BMMF33E43A047599; 00797678336; 16696030636876;
2003; M.BENZ/A 160; JOSE BATISTA VIEIRA; BANCO BRADESCO SA; 2000.00
0306; JIS7553; DF; 8AP17206LB2201591; 00322387884; 310A10110162774;
2011; I/FIAT SIENA FIRE FLEX; JULIO CESAR GARCIA FILHO; BV FINANCEIRA
SA CFI; 2500.00
0307; JIC8524; DF; 9BD135316A2122152; 00146989040; X8*0463078*; 2009;
FIAT/IDEA ADVENTURE FLEX; FRANCIVALDO SOARES JACOBINA; BANCO BRADESCO
FINANCIAMENTOS S.A.; 2500.00
0308; JIC0333; DF; 9BWAA05U5AP099734; 00193353180; CCN417375; 2010;
VW/GOL 1.0; MARISA VIANA PEREIRA; BANCO ITAU CFI; 2000.00
0309; JJH5857; DF; LJ12FKR10C4271258; 00451856970; HFC4EB13DB3468084;
2011; I/JAC J3 TURIN; ABRAAO ALVES COSTA; BANCO PANAMERICANO SA;
2000.00
0310; JGN4857; DF; 9BD15822764731812; 00860177602; 146E1011*6513692*;
2005; FIAT/UNO MILLE FIRE FLEX; JORGE LUIZ SCHUMCHER; BANCO
PANAMERICANO SA; 2000.00
0311; HAB5748; DF; 9BD17103232203526; 00785472452; 5504789; 2002;
FIAT/PALIO FIRE; EDITE ROSADIAS DE SOUZA; BANCO PANAMERICANO SA;
2000.00
0312; JIV8133; DF; 93YLSR6RHBJ754270; 00325257922; D4DH760Q151276;
2011; RENAULT/LOGAN AUT 1016V; ELZI PEREIRA DA SILVA; CIA CFI RCI
BRASIL; 2500.00
0313; JIB6665; DF; 9BFZK03P19B023479; 00966756134; QFRA9023479; 2008;
153308-FORD/KA 1.6FLEX; CARLEONE SILVA COSTA; BANCO PANAMERICANO SA;
2500.00
0314; CRE3624; DF; WVWGC63B9WE454295; 00715180053; ACK086808; 1998;
I/VW PASSAT V6; PUMA LOCADORA E TURISMO LTDA ME; BANCO PANAMERICANO
SA; 2000.00
0315; JJH2574; DF; 9BWAA05W9BP046926; 00269279202; CCP225918; 2010;
VW/GOL 1.0 GIV; ELIANE NASCIMENTO DA SILVA.; BANCO ITAUCARD SA;
2000.00
0316; JHA6732; DF; 9BD17164LA5376665; 00127823654; 310A1011*8648527*;
2009; FIAT/PALIO FIRE ECONOMY; JOSE GONCALVES VIEIRA; BANCO
PANAMERICANO SA; 2000.00
0317; JHF5499; DF; 9BD15822A96191255; 00986553212; 146E1011*8501060*;
2008; FIAT/UNO MILLE ECONOMY; FRANCISCO JOSE ENIO DA SILVA; BANCO FIAT
S/A; 2000.00
0318; JIC5460; DF; 9BD110585A1527407; 00253104670; 310A3011*8723769*;
2010; FIAT/LINEA HLX 1.9 DUAL; ANDERSON JOSE BORGES; BV FINANCEIRA SA
CFI; 2500.00
0319; JKK6367; DF; 9BFZF55A0D8486830; 00538849410; SM9AD8486830; 2013;
FORD/FIESTA FLEX; ERINALDO RIBEIRO DE SOUZA; BANCO ITAUCARD SA;
2000.00
0320; DVD7522; DF; 9BWKB05Z174037965; 00898975522; BPA126696; 2006;
VW/CROSSFOX; BRAS CANDIDO BORBA; BANCO PANAMERICANO SA; 2000.00
0321; DKF6896; DF; 9BWKA05Z754019406; 00834445921; BJE025796; 2004;
VW/FOX 1.0; LUCILENE SILVA ALVES TEIXEIRA; REAL LEASING SA
ARRENDAMENTO MERCANTIL; 2000.00
0322; JJC7064; DF; LJ12EKP12E4601216; 00534448585; HFC4EB13DD3415663;
2013; I/JAC J2 1.4; CECILIO LOPES SALES; AYMORE FINANCIAMENTOS;
2500.00
0323; HPW0298; DF; 94DCMGD225J565003; 00847531090; 40704191102; 2004;
NISSAN/FRONTIER 4X2 SE; EDIMAURA PAES DE SOUSA; BANCO ITAUCARD SA;
3000.00
0325; JJJ3627; DF; LSCBB13D8CG800943; 00457564725; JL466Q4B64F019260;
2011; I/CHANGAN CHANA SC13D; FRANCINALDO MOTA; BRB CREDITO
FINANCIAMENTO E INVESTIMENTO S A; 1500.00
0326; JHR0456; DF; 8AD3DRFJ47G049541; 00926565281; 10LH4P1516969;
2006; I/PEUGEOT 307SD 20S M FL; ELMO ELIAS SANTOS NASCIMENTO; AYMORE
FINANCIAMENTOS; 2500.00
0327; JHL7740; DF; 9BWAA05U5AT154996; 00178301620; CCN377037; 2009;
VW/GOL 1.0; CARLOS ALBERTO DA CUNHA SIMOES; AYMORE FINANCIAMENTOS;
2000.00
0328; JHF6749; DF; 9BD17206G93476865; 00986960845; 178F1011*8498738*;
2008; FIAT/SIENA FIRE FLEX; GILSON FARIAS DE ANDRADE; BB LEASING SA
ARREND. MERCANTIL; 2000.00
0329; JHS9868; DF; 9BWAB05Z294059634; 00982925719; CCR036280; 2008;
VW/CROSSFOX; VIVIANE FERNANDES DA SILVA; BANCO BMC S/A - FINASA;
2500.00
0330; JGS6557; DF; 93HFA16307Z108363; 00890983810; R18A1-7Z108367;
2006; HONDA/CIVIC LXS; EURANIO SOARES SANTOS; ITAU UNIBANCO S.A.;
3000.00
0331; JIO0289; DF; LVVDB12B0BD167850; 00333102118; SQR473FAFBC01664;
2011; I/CHERY FACE 1.3; WM COMERCIO E INDUSTRIA DE VIDROS LTDA; AYMORE
FINANCIAMENTOS; 2000.00
0332; JKJ5719; DF; 9BD372110D4034781; 00539312398; 310A10111459900;
2013; FIAT/SIENA EL 1.0 FLEX; JURACY SILVA DE ALMEIDA; BANCO
PANAMERICANO SA; 2500.00
0333; JGU6486; DF; 9BD11985461031944; 00871362902; 5M*0173519*; 2005;
FIAT/DOBLO ADVENTURE; PAULO AUGUSTO DE SAO JOSE ; BANCO BRADESCO
FINANCIAMENTOS S.A.; 2000.00
0334; JJK0638; DF; 4S4WXFLU5BS029612; 00459571680; U394686; 2010;
I/SUBARU TRIBECA; ESPOBRAS CONSTRUCAO E INCORPORACAO LTDA; BRADESCO
LEASING S.A. - ARRENDAMENTO MERCANTIL; 3500.00
0335; JKJ8367; DF; 9BD15822AD6830581; 00538014156; 146E10111480325;
2013; FIAT/UNO MILLE ECONOMY; RICARDO DOS SANTOS; BANCO PANAMERICANO
SA; 2000.00
0336; JGB3807; DF; 9BD17140212078216; 00762552905; 5127709; 2001;
FIAT/PALIO EX; HELIO DA SILVA COUTINHO; BANCO ITAUCARD SA; 2000.00
0337; JDV8492; DF; 9BFZF20B558295288; 00846940000; CAJA58295288; 2005;
FORD/FIESTA SEDAN; JOAQUIM JUARES DA SILVA; BANCO PECUNIA S/A; 2000.00
0338; JHN0991; DF; 8BCLDRFJWAG528812; 00199523363; 10TWAA0037624;
2009; I/CITROEN C4 PALLAS20EAF; PAULO HENRIQUE CARVALHO DE MELO ME;
CAIXA ECONÔMICA FEDERAL; 3000.00
0339; JGZ5695; DF; 9BWCA05W66T164423; 00885894626; BNW097198; 2006;
VW/GOL 1.0; PATRICIA DE JESUS OLIVEIRA; BANCO PANAMERICANO SA; 1500.00
0340; JHN2980; DF; 9BWDB09N5AP014145; 00172998115; BPA214436; 2009;
VW/POLO SEDAN 1.6; VALDEIR ALVES NOGUEIRA; BANCO ITAUCARD SA; 2000.00
0341; JHM0175; DF; 9BD17206G73324431; 00919759297; 178F1011*7552450*;
2007; FIAT/SIENA FIRE FLEX; ELAINE MARIA FERREIRA LIRA; BANCO
PANAMERICANO SA; 2000.00
0342; JIK9533; DF; 9BWAA05U9BT161869; 00259555479; CCN661628; 2010;
VW/GOL 1.0; MARIA DOS REIS DAMASCENO DA CRUZ; BV FINANCEIRA SA CFI;
2000.00
0343; JIS7029; DF; 9BD15802AC6641487; 00363467912; 146E10110537174;
2011; FIAT/UNO MILLE ECONOMY; CLERISTON APOLINARIO DE ALCANTARA; BANCO
FIAT S/A; 2000.00
0344; JHZ8910; DF; 9BGRM69X0BG201219; 00256126208; NAC034829; 2010;
GM/PRISMA MAXX; TEMISTOCLES FERREIRA MENEZES; BV LEASING ARRENDAMENTO
MERCANTIL SA; 2000.00
0345; HCU7682; DF; 8AD3CRFN16G012508; 00889092001; 10LH2X1388201;
2005; I/PEUGEOT 307 20 FELINE; ADRIANA DOMINGOS DE OLIVEIRA; BANCO
PANAMERICANO SA; 2000.00
0347; JHB2412; DF; 9BGSA19109B248600; 00128377208; S80006976; 2009;
GM/CLASSIC LIFE; SEBASTIAO JORGE DOS SANTOS; BFB LEASING S.A.
ARRENDAMENTO MERCANTIL; 2500.00
0349; JHL9804; DF; 9BWGF07X18P023201; 00959668322; BTJ052200; 2008;
VW/KOMBI; VAGNER BARBOSA DAMASCENO; SOROCRED - CREDITO, FINANC. E
INVESTIMENTO S/A; 2500.00
0350; JIF4985; DF; 9BD17164G85232345; 00967203520; 178F1011*8169351*;
2008; FIAT/PALIO FIRE FLEX; MARCIEL MENDES DOS SANTOS; CAIXA ECONÔMICA
FEDERAL; 2500.00
0351; JGU7099; DF; 9BWCA05W46T197050; 00894987666; BNW124850; 2006;
VW/GOL 1.0 COPA; LEONARDO FERRAZ DE QUEIROZ; BANCO ITAUCARD SA;
2000.00
0352; JIB9378; DF; 9BFZF54A798415312; 00164380370; SM9A98415312; 2009;
FORD/FIESTA SEDAN FLEX; FLORA MECUPRE COELHO DA MOTA CABRAL; BANCO
PANAMERICANO SA; 2000.00
0353; JHB6982; DF; 9BD19250R93087919; 00126902100; Q7*0414787*; 2009;
FIAT/STILO SPORTING FLEX; WESLEY HOLANDA DA SILVA; AYMORE
FINANCIAMENTOS; 2000.00
0354; JHS1582; DF; 9BWAA05U3AT230876; 00200075160; CCN462504; 2010;
VW/GOL 1.0; FABIANO SILVA DOS SANTOS; BANCO BRADESCO FINANCIAMENTOS
S.A.; 2500.00
0356; JKE9912; DF; 9BWAB05U0DT078699; 00469748125; CCRN38259; 2012;
VW/GOL 1.6; PONTO COM SOLUCOES EM TEC DA INF LTDA ME; BANCO SANTANDER
BRASIL S/A; 2500.00
0357; JEM7016; DF; 9BWKA05Z544018334; 00828846650; BJE012286; 2004;
VW/FOX 1.0; JOSEANNE MARIA DA SILVA LUZIA; HSBC BANK BRASIL S/A BM;
2000.00
0358; JFU9161; DF; 9362AN6A96B016806; 00873961633; 10DBTX0000451;
2005; PEUGEOT/206 16 HOLID FX; CLEY FERREIRA DE MACEDO; BB LEASING SA
ARREND. MERCANTIL; 2000.00
0359; JHO8032; DF; 9BFZF54P4A8034381; 00198371420; QF9AA8034381; 2010;
FORD/FIESTA SEDAN1.6FLEX; MARTA APARECIDA RODRIGUES RIBEIRO; BANCO
ITAU BBA SA; 2500.00
0360; JIK3300; DF; 8AP372111C6010504; 00341484245; 310A20110222639;
2011; I/FIAT SIENA EL FLEX; SERGIO BARBOSA DANTAS; BV FINANCEIRA SA
CFI; 2000.00
0362; JHC2944; DF; 93HGD17607Z203068; 00919454690; L13A4-7Z203064;
2007; HONDA/FIT LXL; LUIS FELIPE DA COSTA SILVA; BANCO PANAMERICANO
SA; 3500.00
0363; HAN9315; DF; 9BD19240T53030666; 00838707220; 7Z*0092586*; 2004;
FIAT/STILO; MARCELO BARRAMACHER TOCANTINS; BANCO PANAMERICANO SA;
2000.00
0364; JHI3665; DF; 9BD17106G72863905; 00900855312; 178F1011*7280491*;
2006; FIAT/PALIO FIRE FLEX; ILDEMAR DA COSTA; BANCO PANAMERICANO SA;
1500.00
0365; JIB7544; DF; 9BWAA05Z494144655; 00148089003; CCN151413; 2009;
VW/FOX 1.0; ADEILDE DE SOUZA CHAVES; BANCO BRADESCO FINANCIAMENTOS
S.A.; 2500.00
0366; JKN0585; DF; 9BFZF55A4E8041900; 00569311802; SM9AE8041900; 2013;
FORD/FIESTA FLEX; FERNANDO DOS SANTOS; BANCO PANAMERICANO SA; 2000.00
0367; KGZ8961; DF; 9BFZF55P9A8027280; 00197091482; QF9AA8027280; 2010;
FORD/FIESTA 1.6 FLEX; MANOEL DOS REIS VIANA DE SOUSA; BANCO SANTANDER
BRASIL S/A; 2000.00
0368; JHZ6417; DF; 9BD17164LA5464946; 00154185191; 310A1011*8923435*;
2009; FIAT/PALIO FIRE ECONOMY; AHISTIR MARA SILVA; BV FINANCEIRA SA
CFI; 2000.00
0369; JHY3246; DF; 9BWCA05W38T142835; 00945920482; BNW380552; 2007;
VW/GOL 1.0; JONATHAN BARBOSA SILVA; BV FINANCEIRA SA CFI; 3000.00
0370; JGR0169; DF; 8AFDZZFHA4J327237; 00813798485; 4J327237; 2003;
I/FORD FOCUS 1.6L HA;NICHOLLAS MARQUES DE QUEIROZ GONÇALVES; BANCO
ITAUCARD SA; 1500.00
0371; JHX2575; DF; 9BWCA05W28P074052; 00943512786; BNW362784; 2007;
VW/GOL 1.0; GERSON DA SILVA FERREIRA; BANCO PANAMERICANO SA; 3000.00
解决方案
根据数据文件的实际格式,您可能会使事情变得比实际需要的更难(并且更容易出错)。正如@JonathanLeffler在他的评论中指出的那样,您的数据文件应该(理想情况下)每行包含一个帐户记录。不像您在每条记录中分散的换行符所示。
如果您遇到的文件带有分散的换行符(以及分隔符周围的空格),您最好重新格式化您的数据文件。
尽管您有许多答案讨论了面向字段的输入以处理分散的换行符,但当每条记录为单行时,一种常见的方法是一次读取数据文件一行(面向行)的方法。这使您可以使用其中一个fgets
(或 POSIX getline
)进行阅读。
通过一次读取一行,您必须单独验证 (1) 读取行本身;(2) 从每一行解析您需要的信息。
方法相当简单。一次将一行读入足够大的固定缓冲区,或者让getline
动态分配所需的存储空间。将每一行读入缓冲区后,您可以通过 (1) 使用格式化解析将缓冲区解析为单独的字段sscanf
;(2) usingstrtok
访问每个字段(不允许为空字段);(3) 使用strsep
类似于strtok
,但占空字段;(4) 您始终可以将一对指针沿缓冲区向下移动,检查每个字符并根据需要处理解析。
在这里,由于您正在尝试fscanf
,我们将使用sscanf
which 是一个紧密的推论。(你可以通过一次调用来读取和解析fscanf
,但是你失去了单独验证读取和解析的好处——这取决于你)
使用 时sscanf
,您解析信息的方式与使用 时相同fscanf
,只是您从填充的缓冲区而不是文件中读取信息。您对格式字符串的选择至关重要,并且应该通过使用字段宽度修饰符来保护您拥有的任何数组边界。
(注意:每个定界符周围的空格很奇怪,不清楚这是有意的还是偶然的。下面的内容假定没有,但会消耗任何前导空格,同时让您修剪字段末尾和定界符之间的任何尾随空格字符字段)
考虑到这一点,您可以从数据文件中读取和解析类似于以下内容的信息:
char buf[MAXC] = ""; /* buffer to read line at a time */
size_t n = 0; /* line index */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
...
if (!fgets (buf, MAXC, fp)) { /* read/discard heading row */
fprintf (stderr, "error: failed to read 1st line.\n");
return 1;
}
...
n++;
while (fgets (buf, MAXC, fp)) { /* read each line into buf */
veiculos tmp = { .lote = 0 }; /* temp struct to fill */
/* validate the return of sscanf to validate parse/conversions */
if (sscanf (buf, "%d; %49[^;]; %9[^;]; %49[^;]; %d; %99[^;]; %d; "
"%99[^;]; %99[^;]; %99[^;]; %f",
&tmp.lote, tmp.placa, tmp.uf, tmp.motor, &tmp.renavam,
tmp.chassi, &tmp.ano, tmp.marca, tmp.proprietario,
tmp.financeira, &tmp.valor) != 11) {
/* if less than 11 returned, failed read, handle error */
fprintf (stderr, "read-error: line %zu.\n", n);
continue; /* get next line */
}
/* ==> add tmp to binary tree here <==
* (note: you will need to trim trailing whitespace from strings)
*/
printf ("line[%3zu]: %5d %10s %4s %24s ...\n",
n, tmp.lote, tmp.placa, tmp.uf, tmp.motor);
n++;
}
不要在代码中使用幻数。(例如[10] [50] [100]
,等等...)相反,如果您的代码需要常量,#define
或者使用全局enum
来定义它们。
始终验证所有输入(尤其是用户输入)。未能检查输入函数的返回是对未定义行为和无限循环的邀请,因为您无法检测输入或匹配失败或检测EOF
. 如果您未能检测到任何这些条件并盲目地继续尝试从处于错误状态的流中读取,您将调用Undefined Behavior。
将这些部分放在一起,您可以类似于以下方式读取您的帐户信息(将该信息添加到您的 btree 留给您),例如
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* don't put 'magic numbers' in your code, if you need constants,
* #define them, or use an enum as below:
*/
enum { MAXU = 10, MAXP = 50, MAXI = 100, MAXC = 1024 };
typedef struct { /* typedef for struct */
int lote;
char placa[MAXP];
char uf[MAXU];
char motor[MAXP];
int renavam;
char chassi[MAXI];
int ano;
char marca[MAXI];
char proprietario[MAXI];
char financeira[MAXI];
float valor;
} veiculos;
int main (int argc, char **argv) {
char buf[MAXC] = ""; /* buffer to read line at a time */
size_t n = 0; /* line index */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
if (!fgets (buf, MAXC, fp)) { /* read/discard heading row */
fprintf (stderr, "error: failed to read 1st line.\n");
return 1;
}
printf ("header line stripped\n\n");
n++;
while (fgets (buf, MAXC, fp)) { /* read each line into buf */
veiculos tmp = { .lote = 0 }; /* temp struct to fill */
/* validate the return of sscanf to validate parse/conversions */
if (sscanf (buf, "%d; %49[^;]; %9[^;]; %49[^;]; %d; %99[^;]; %d; "
"%99[^;]; %99[^;]; %99[^;]; %f",
&tmp.lote, tmp.placa, tmp.uf, tmp.motor, &tmp.renavam,
tmp.chassi, &tmp.ano, tmp.marca, tmp.proprietario,
tmp.financeira, &tmp.valor) != 11) {
/* if less than 11 returned, failed read, handle error */
fprintf (stderr, "read-error: line %zu.\n", n);
continue; /* get next line */
}
/* ==> add tmp to binary tree here <==
* (note: you will need to trim trailing whitespace from strings)
*/
printf ("line[%3zu]: %5d %10s %4s %24s ...\n",
n, tmp.lote, tmp.placa, tmp.uf, tmp.motor);
n++;
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
(注意:将字符串存储在固定长度的数组(例如placa, chassis
等)中非常节省空间,因为在许多情况下您将存储大部分空白(或不确定的值)。更好的方法是为基于strlen
每个字段的每个字符串(+1
对于nul-terminatng字符)
示例使用/输出
在每行 1 条完整记录的输入文件上运行上述内容将产生以下结果:
$ ./bin/readaccts dat/accounts.txt
header line stripped
line[ 1]: 1 LJG6509 DF BA042893 ...
line[ 2]: 2 HBR7108 DF 9BD17206G83400203 ...
line[ 3]: 3 JJB0059 DF 9BD17201B53124230 ...
line[ 4]: 4 JGG0484 DF 93HGD17404Z120657 ...
line[ 5]: 5 LJQ8142 RJ LB8ABK60592 ...
line[ 6]: 6 JDQ0675 DF 9BG5TC11UFC158987 ...
line[ 7]: 7 JGQ8447 DF 9BFZF10B678103244 ...
line[ 8]: 8 JDS8539 GO BA170068 ...
line[ 9]: 9 JFT5423 DF 9BGSD19401C189366 ...
line[ 10]: 10 JJD1340 DF 9BD178237T0079169 ...
line[ 11]: 11 KDR1120 DF 9BGLK19BRRB315479 ...
line[ 12]: 12 KAW6325 GO LB4DPA78820 ...
line[ 13]: 13 JEQ3930 DF BS012252 ...
line[ 14]: 14 HYS6690 CE 9BGRD48X04G134684 ...
line[ 15]: 15 JGA2435 DF 9BGSC68Z01B167794 ...
line[ 16]: 301 JHH8778 DF 8BCLDRFJ48G521910 ...
line[ 17]: 302 JKJ5612 DF 9BWAA05W5DP091431 ...
line[ 18]: 303 JHY8370 DF 8AGCN48X0BR142232 ...
line[ 19]: 304 LNN3808 DF 93UMA48L714010797 ...
line[ 20]: 305 LOM1229 DF 9BMMF33E43A047599 ...
<snip next 50 lines>
line[ 71]: 360 JIK3300 DF 8AP372111C6010504 ...
line[ 72]: 362 JHC2944 DF 93HGD17607Z203068 ...
line[ 73]: 363 HAN9315 DF 9BD19240T53030666 ...
line[ 74]: 364 JHI3665 DF 9BD17106G72863905 ...
line[ 75]: 365 JIB7544 DF 9BWAA05Z494144655 ...
line[ 76]: 366 JKN0585 DF 9BFZF55A4E8041900 ...
line[ 77]: 367 KGZ8961 DF 9BFZF55P9A8027280 ...
line[ 78]: 368 JHZ6417 DF 9BD17164LA5464946 ...
line[ 79]: 369 JHY3246 DF 9BWCA05W38T142835 ...
line[ 80]: 370 JGR0169 DF 8AFDZZFHA4J327237 ...
line[ 81]: 371 JHX2575 DF 9BWCA05W28P074052 ...
如果您还有其他问题,请仔细查看并告诉我。
推荐阅读
- python - raise ValueError('无法设置没有定义索引的框架' ValueError:
- java - 在java中合并两个具有相同键的地图
- android-studio - Android Studio Profiler 在 ubuntu 16.04 中非常滞后
- android - 如何使用 jks 文件更新 Android 应用程序?
- c# - SonarQube 分析任务更改构建的输出
- javascript - 是否可以制作一个触发 PWA“添加到主屏幕”安装横幅的应用内按钮?
- c# - MS Bot 框架中的自动填充选项
- assembly - 如何在 nasm 中为 BIN 文件创建 ELF 子系统?
- android - 适用于 API 10 的 AppCompatV7 最新版本
- node.js - Angular 4 - 使用 http 请求检测连接问题