Eine Sache ist noch nicht implementiert, nämlich UTF-8. Da dort die Zeichenlänge in Byte unterschiedlich sein kann, ist es nicht ganz so leicht da durch zu rennen. Aber ich habe da schon eine Idee. Wichtig war für mich auch, dass alle drei Zeilenumbrüche erkannt werden, also CR, LF und CRLF.
Macht mal einen Speedtest. Hab da grad keine Lust zu.

///Edit:
Code etwas geändert, damit keine extra Structure mehr nötig ist.
Code: Alles auswählen
;Text2Array (PB 4.50 beta 2)
;von DrFalo, ts-soft, NicTheQuick, ...
EnableExplicit
Procedure Text2Array(Datei.s, Array TextZeile.s(1))
Protected cLines.i, fileSize.i, stringFormat.i
Protected hFile = ReadFile(#PB_Any, Datei)
Protected *memBegin, *mem, i.i, *memEnd, *lineBegin, ca.a, cc.c
Protected NewList lineBegins.i()
If hFile
stringFormat = ReadStringFormat(hFile)
fileSize = Lof(hFile)
If fileSize = 0 : ProcedureReturn : EndIf
*memBegin = AllocateMemory(fileSize)
If *memBegin
ReadData(hFile, *memBegin, fileSize)
EndIf
CloseFile(hFile)
EndIf
If Not *memBegin : ProcedureReturn : EndIf
*mem = *memBegin
*memEnd = *mem + fileSize
Select stringFormat
Case #PB_Ascii
Debug "ASCII"
*lineBegin = *mem
While *mem < *memEnd
ca = PeekA(*mem)
Select ca
Case #CR
PokeA(*mem, 0)
If AddElement(lineBegins())
lineBegins() = *lineBegin
EndIf
If PeekA(*mem + 1) = #LF : *mem + 1 : EndIf
*lineBegin = *mem + 1
Case #LF
PokeA(*mem, 0)
If AddElement(lineBegins())
lineBegins() = *lineBegin
EndIf
*lineBegin = *mem + 1
EndSelect
*mem + 1
Wend
If *lineBegin < *memEnd
If AddElement(lineBegins())
lineBegins() = *lineBegin
EndIf
EndIf
Case #PB_UTF8
Debug "UTF8"
;TODO
Case #PB_Unicode
Debug "UNICODE"
*lineBegin = *mem
While *mem < *memEnd
cc = PeekC(*mem)
Select cc
Case #CR
PokeC(*mem, 0)
If AddElement(lineBegins())
lineBegins() = *lineBegin
EndIf
If PeekC(*mem + 2) = #LF : *mem + 1 : EndIf
*lineBegin = *mem + 2
Case #LF
PokeC(*mem, 0)
If AddElement(lineBegins())
lineBegins() = *lineBegin
EndIf
*lineBegin = *mem + 2
EndSelect
*mem + 2
Wend
If *lineBegin < *memEnd
If AddElement(lineBegins())
lineBegins() = *lineBegin
EndIf
EndIf
Default
ProcedureReturn
EndSelect
cLines = ListSize(lineBegins())
ReDim TextZeile(cLines - 1)
i = 0
ForEach lineBegins()
TextZeile(i) = PeekS(lineBegins(), -1, stringFormat)
i + 1
Next
FreeMemory(*memBegin)
EndProcedure
Define.s Datei
Define A, time.i
Dim TextZeile.s(0)
Datei.s = OpenFileRequester("Datei auswählen...", "", "Text (.txt)|*.txt", 0)
If Datei
time.i = ElapsedMilliseconds()
Text2Array(Datei, TextZeile.s())
time = ElapsedMilliseconds() - time
MessageRequester("", "Zeit: " + Str(time) + " ms") ;28 ms
Debug "Insgesamt " + Str(ArraySize(TextZeile()) + 1) + " Zeilen"
Debug ""
For A = 0 To ArraySize(TextZeile())
If A = 200
Debug "u.s.w."
Break ; ab Zeile 10 abbrechen
EndIf
Debug "Zeile " + Str(A) + ": " + TextZeile(A)
Next A
EndIf