c - 在C语言的.text文件中读取“;”之间的字符串

标签 c string b-tree

更新:谢谢大家!你很有帮助,非常感谢大家!
我必须从一个.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(或POSIXgetline)进行阅读。
通过一次读取一行,您必须分别验证(1)对行本身的读取;(2)对每行所需信息的解析。
方法相当简单。一次将一行读取到足够大的固定缓冲区中,或者让getline动态分配所需的存储a。在将每一行读入缓冲区后,您可以通过(1)使用带sscanf的格式化解析;(2)使用strtok访问每个字段(不允许使用空字段);(3)使用类似于strsepstrtok,但要考虑空字段;并且(4)您始终可以在缓冲区中遍历一对指针,检查每个字符并根据需要处理解析。
在这里,由于您尝试使用fscanf,我们将使用sscanf,这是一个紧密的推论。(您可以通过对fscanf的单个调用来读取和解析,但是您失去了对读取和解析进行单独验证的好处——这取决于您自己)
使用sscanf时,解析信息的方式与使用fscanf时相同,只是从已填充的缓冲区(而不是从文件)读取信息。格式字符串的选择非常关键,应该使用field width修饰符来保护数组边界。
(注意:每个分隔符周围的空白是奇怪的,不清楚这是有意的还是无意的。下面的读取假定为无,但将使用任何前导空格,同时让您修剪字段结尾和字符字段分隔符之间的任何尾随空格)
考虑到这一点,您可以从数据文件中读取和解析信息,如下所示:

    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。如果检测不到这些条件中的任何一个,并且盲目地继续尝试在错误状态下读取流,则将调用未定义的行为。
把这些部分放在一起,您可以像下面这样读取您的帐户信息(将该信息添加到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为每个字符串分配存储空间(对于以nul结尾的字符,+1
示例使用/输出
在您的输入文件中以每行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 ...

再看一遍,如果你还有问题,请告诉我。

关于c - 在C语言的.text文件中读取“;”之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51110692/

相关文章:

这种地址分配和使用方法会调用未定义的行为吗?

java - btree算法的问题

Postgresql 奇怪的索引大小

MySQL Btree : Does cardinality and column order matters for a composite index when all columns are used?

c - 打印off_t

无法针对 OCILIB 进行编译

c++ - 如何从字符串末尾提取数字

mysql - 在MySql中添加索引到日期字符串字段

objective-c - 如何在 NSValueTransformer 中进行字符串操作?

python - 关于程序的时间复杂度