17. april 2002 - 15:23Der er
18 kommentarer og 1 løsning
HJÆLP...
Jeg er ved at lave en opgave på Teknisk Skole.
Jeg skal lave en lix-beregner med tilhørende highscoreliste. Lixberegneren er lavet - men ikke highscorelisten.
Det fungerer på den måde at jeg skal hive en txt dokument ind i et array - hvordan gør jeg det???
Der efter skal jeg overskrive txt dokumentet med det nye array - hvordan gør jeg det??? Jeg kan godt få kontakt med tekstfilen og udskrive den -men jeg kan ikke få den lagt i et array...
Hvis du kan få kontakt med tekstfilen og udskrive den - så mangler du jo kun at skrive en ny tekstfil.
Hvis det kan hjælpe så er her koden for at skrive til en fil.
<% dim fso, f, filespec set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.MapPath("\") & "\test\logfil.txt" Set f = fso.OpenTextFile(filespec,2) ' Åbn fil for skrivning f.WriteLine "Indhold af linie 1" f.WriteLine "Indhold af linie 2" f.Close %>
Problemet er at jeg ud fra et nyåbnet tekstdokument skal beregne lix tallet - det er klaret. Derefter skal jeg åbne en eksisterende highscore.txt. Så skal jeg tjecke om det nyfundne lix-tal er højt nok til at komme i highscore filen, som indeholder "top 10". Såfremt det er det - skal den nye lixtal lægges ind hvor den mindste lixtal lå. Derefter sorteres arrayet med top10 og ligges i et tekstdokument... Lidt af en opgave for en newbie
Var det ikke en ide at lægge hver linie i highscore.txt ind i en db-tabel. Derefter også den nye tekst-fil, men tilhørende lix-tal. Derefter trækkes de 10 (eller hvor mange der nu er på listen) tekstfiler med højeste lix-tal ud, og lægges over i en ny highscore.txt (der overskriver den gamle)
Ved godt det måske ikke er god programmerings-skik men på denne måde spares arbejdet på en sorterings-algoritme. (Den er jo indbygget i db'en)
- hvilken tekstfil er det, der skal hentes ind i et array?? - vil du ha' løsningen, eller vil du bare ha' koden? - hvad betyder tallene 49, 47, 46, 43 etc.?
hvilken tekstfil er det, der skal hentes ind i et array?? - det er highscorelisten. vil du ha' løsningen, eller vil du bare ha' koden? - Koden ville være optimalt, men løsningen er ok... hvad betyder tallene 49, 47, 46, 43 etc.? - det er lixtallene for foregående beregninger - jo højere tal des højere placering skal de have. Hvis der fx kommer en beregning der giver 60 skal den sættes ind og den med det mindste tal smides ud...
Jeg kunne ikke lade være - denne kode åbner filen og indlæser hver linie i et array - derefter genneløbes arrayet og linierne gemmes i samme fil og når det er passende så puttes den nye linie ind i mellem.
En indlæsning - sortering under udlæsning.
<% ' Funktion til udtræk at første tal i en linie function GetNum(L) GetNum = CInt(Left(L, inStr(L, ",") - 1)) ' Returner som Integer end function
' Ny linie som skal puttes ind i mellem NyLix = "42, c:\inetpub\wwwroot\oblig_opg\testtekst.txt" NyLixNum = GetNum(NyLix) ' Find værdien af nye linie
dim fso, f, filespec dim arrLix
' *** Indlæs filen i arrLix set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.MapPath("lix.max") Set f = fso.OpenTextFile(filespec, 1) ' Åbn inputfil for læsning arrLix = Split(f.ReadAll, vbCrLf) ' Læs hele filen og split den op linie for linie i arrLix f.Close ' Luk inputfilen igen
' Herefter udlæses linierne igen - og den nye linie puttes ind hvor NyLixNum passer i listen Set f = fso.OpenTextFile(filespec, 2) ' Åbn outputfil for skrivning Used = False ' Den nye linie er ikke læst ud i filen for each Line in arrLix ' Gennemløb alle linier i arrLix if Line <> "" then if not Used and (NyLixNum > GetNum(Line)) then f.WriteLine NyLix ' gem nye linie i fil Used = True ' Den nye linie er nu læst ud i filen end if f.WriteLine Line ' gem gamle linie i fil end if next f.Close ' Luk outputfilen igen %>
Den var værre man kan ikke bare skrive "for each Line in arrLix - 1"
Men det kan løses ved at "stacke" linierne i stedet for at skrive dem til filen direkte - således at det altid er den forrige linie der skrives til filen. (Eller kald det skrivning til fil med en linies forsinkelse og "glem" at skrive den sidste linie.) her er koden. Jeg har skrevet TILFØJET efter de ændringer det har medført
<% ' Funktion til udtræk at første tal i en linie function GetNum(L) GetNum = CInt(Left(L, inStr(L, ",") - 1)) ' Returner som Integer end function
' Ny linie som skal puttes ind i mellem NyLix = "42, c:\inetpub\wwwroot\oblig_opg\testtekst.txt" NyLixNum = GetNum(NyLix) ' Find værdien af nye linie
dim fso, f, filespec dim arrLix, StackLine ' TILFØJET StackLine
sub StackL(Line) ' TILFØJET Funktion til skrivning til fil med 1 linies forsinkelse if StackLine <> "" then f.WriteLine StackLine ' Gem linie i fil end if if Line <> "" then StackLine = Line end if end sub
' *** Indlæs filen i arrLix set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.MapPath("lix.max") Set f = fso.OpenTextFile(filespec, 1) ' Åbn inputfil for læsning arrLix = Split(f.ReadAll, vbCrLf) ' Læs hele filen og split den op linie for linie i arrLix f.Close ' Luk inputfilen igen
' Herefter udlæses linierne igen - og den nye linie puttes ind hvor NyLixNum passer i listen Set f = fso.OpenTextFile(filespec, 2) ' Åbn outputfil for skrivning Used = False ' Den nye linie er ikke læst ud i filen for each Line in arrLix ' Gennemløb alle linier i arrLix if Line <> "" then if not Used and (NyLixNum > GetNum(Line)) then Call StackL(NyLix) ' gem nye linie i fil TILFØJET Call StackL Used = True ' Den nye linie er nu læst ud i filen end if Call StackL(Line) ' gem gamle linie i fil TILFØJET Call StackL end if next f.Close ' Luk outputfilen igen %>
eller - det vil sige at det ikke virker helt efter hensigten. Det var meningen at, hvis det nye lixtal ikke var større end nogle af de eksisterende, skulle der ikke ske noget som helst... men det gør der...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.