首页 > 解决方案 > 读取“;”之间的字符串 在 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

标签: cstringb-tree

解决方案


根据数据文件的实际格式,您可能会使事情变得比实际需要的更难(并且更容易出错)。正如@JonathanLeffler在他的评论中指出的那样,您的数据文件应该(理想情况下)每行包含一个帐户记录。不像您在每条记录中分散的换行符所示。

如果您遇到的文件带有分散的换行符(以及分隔符周围的空格),您最好重新格式化您的数据文件。

尽管您有许多答案讨论了面向字段的输入以处理分散的换行符,但当每条记录为单行时,一种常见的方法是一次读取数据文件一行(面向行)的方法。这使您可以使用其中一个fgets(或 POSIX getline)进行阅读。

通过一次读取一行,您必须单独验证 (1) 读取行本身;(2) 从每一行解析您需要的信息。

方法相当简单。一次将一行读入足够大的固定缓冲区,或者让getline动态分配所需的存储空间。将每一行读入缓冲区后,您可以通过 (1) 使用格式化解析将缓冲区解析为单独的字段sscanf;(2) usingstrtok访问每个字段(不允许为空字段);(3) 使用strsep类似于strtok,但占空字段;(4) 您始终可以将一对指针沿缓冲区向下移动,检查每个字符并根据需要处理解析。

在这里,由于您正在尝试fscanf,我们将使用sscanfwhich 是一个紧密的推论。(你可以通过一次调用来读取和解析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 ...

如果您还有其他问题,请仔细查看并告诉我。


推荐阅读