webForumDet fria alternativet

Läsa in värden från fil

13 svar · 452 visningar · startad av N-Foe

N-FoeMedlem sedan juni 200384 inlägg
#1

Hur läser man in värden som är sparade i en fil?
Värdena består utav int:s.
Kan man läsa in ints direkt med nån metod? Eller kan man läsa in varje char med tex FileInputStream och sen omvandla till int?

I vilket fall som helst måste man väl ha nåt slags stopp-tecken mellan talen? Kan man lösa det genom att varje tal står på en rad och så att man läser in hela raden vid varje inläsning. Då slipper man en massa stopp-tecken.

ViktorMedlem sedan aug. 20021 752 inlägg
#2

Är det en text fil eller en binär fil? Om det är en binär fil så är ju alla ints 4 byte, då behövs inget stop tecken mellan varje. Du använder då en DataInputStream för att läsa från filen

DataInputStrea dis=new DataInputStream(new FileInputStream("kalle.dat"));
int tal1=dis.readInt();
int tal2=dis.readInt();
dis.close();

Om det är en text fil så kan det bli mycket svårare, men då är funktionen Integer.parseInt bra att använda för att konvertera en text sträng till en int.

/Viktor

N-FoeMedlem sedan juni 200384 inlägg
#3

Dessvärre är det en text-fil...

pettssonMedlem sedan jan. 20021 122 inlägg
#4

Vet du hur långa dessa intar är? Om de alla alltid är lika långa borde du ju kunna läsa in det antalet tecken och, som Viktor sa, parseInt:a dom och spara undan på rätt plats

PeWMedlem sedan juni 200010 432 inlägg
#5

Är det en textfil är allt som står där strängar och ska behandlas som strängar. Det betyder att varje ord (int i det här fallet) även har ett \0 - tecken.. dvs det stopptecken du skrev om. Så det är bara att läsa in ett ord i taget och konvertera om det ordet till en Integer (det som man får när man parsar genom metoden parseInt, vilket egentligen inte är en äkta int i bemärkelsen primitiven int).

spangoMedlem sedan juni 20008 205 inlägg
#6

PeW, nu talar du fel språk ;)

Java använder inga \0-tecken, du får göra något i stil med det här:

BufferedReader in = ...;
String line;
while ((line = in.readLine()) != null) {
    StringTokenizer st = new StringTokenizer(line); // antar att talen är åtskilda av whitespace
    while (st.hasMoreTokens()) doSomething(Integer.parseInt(st.nextToken()))
}
N-FoeMedlem sedan juni 200384 inlägg
#7

Hur får jag BufferedReader instansen att läsa från filen?

spangoMedlem sedan juni 20008 205 inlägg
#8

RTFM

N-FoeMedlem sedan juni 200384 inlägg
#9

sant.. fattar nu! sorry ;)

PeWMedlem sedan juni 200010 432 inlägg
#10

spango skrev:

PeW, nu talar du fel språk ;)

Java använder inga \0-tecken

Ok, det var ett tag sedan jag proggade i Java och Haskellkursen genererade ett antal overflows i minnet :p
Men hur markeras strängslut i java då, enligt dig? Hur tar jvm reda på längden av en sträng (sätter size) om den inte har en terminering av strängen? Såvitt jag sett så anger man inte saker som "kalle"5 eller "kalle<slut>" ;) :p
Ok, det är skillnad på primitiva chararrays och Strings i både Java och C++, då det senare är ett objekt och det första en primitiv, men i botten är även värdet av Strings ett antal sammansatta byten i minnet (primitiv chararray).
Om det inte fanns en terminering av strängarna skulle en åtskillnad av ord mha whitespace oåterkalleligt ge att ord som "Junk food" ge uppdelning av orden till "Junk" och "Food", eller hur? ;)

spangoMedlem sedan juni 20008 205 inlägg
#11

PeW skrev:

Men hur markeras strängslut i java då, enligt dig? Hur tar jvm reda på längden av en sträng (sätter size) om den inte har en terminering av strängen? Såvitt jag sett så anger man inte saker som "kalle"5 eller "kalle<slut>" ;) :p

Strängar lagras internt i java.lang.String som char[], och arrayers längd hållre man koll på med medlemsvariabeln length :p
Om du inte tror mig kan du ju ta och kika i src.zip som följer med JDK:n.

PeW skrev:

Om det inte fanns en terminering av strängarna skulle en åtskillnad av ord mha whitespace oåterkalleligt ge att ord som "Junk food" ge uppdelning av orden till "Junk" och "Food", eller hur? ;)

Mmm, men när man bara trixar med siffror (som i exemplet ovan) funkar whitespace himla bra som separator...

PeWMedlem sedan juni 200010 432 inlägg
#12

Strängar lagras internt i java.lang.String som char[], och arrayers längd hållre man koll på med medlemsvariabeln length
Om du inte tror mig kan du ju ta och kika i src.zip som följer med JDK:n.

Jag skrev ju samma sak så varför skulle jag inte tro dig? ;) Visst håller man koll på längen av strängen genom lenght (inte size som jag skrev), men det värdet kommer sig ju av att man nånstans räknat fram antalet tecken till terminering av strängen, eller hur?

Jaja, skitsamma... inget att tjafsa om, nu ska jag slänga ihop en lexicalanalysator och rekursiv prediktiv parser - i C :p :)

Sang-draxMedlem sedan juli 2002581 inlägg
#13

PeW skrev:

[...] konvertera om det ordet till en Integer (det som man får när man parsar genom metoden parseInt, vilket egentligen inte är en äkta int i bemärkelsen primitiven int).

Integer.parseInt returnerar ingenting annat än int.

PeW skrev:

Jaja, skitsamma... inget att tjafsa om, nu ska jag slänga ihop en lexicalanalysator och rekursiv prediktiv parser - i C

Oooh vad du är duktig.:OO

PeWMedlem sedan juni 200010 432 inlägg
#14

Sang-drax skrev:

Integer.parseInt returnerar ingenting annat än int.

Japp, det var fel av mig. Har inget att "skylla på" och tänker inte ens försöka.

Sang-Drax skrev:

Oooh vad du är duktig.:OO

Säger du det? Jag vet inte vad du har för ambitioner när du skriver inlägg, det kanske är att vara duktig, vad vet jag? Det jag ivf gjorde var att ironisera över situationen genom att tillstå att språket C är roligare, men du kanske inte fattade det?

131 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)