中文偽春菜後援會論壇  

打印

[求助] 文件讀取相關

文件讀取相關

正在做一個單詞測驗感覺的功能,但是因為不會編程,遇到了很多問題。
思路大概是有一個現成的txt文件,從當中隨機讀取幾行,然後拆分中文和英文的部份做成題目和選項。
(非常不好意思……這裡現在嘗試調用的是橘花當中用“|”分開的詞典文件)
有想到可以用FREAD操作,但是每次祗可以讀取一行的樣子,感覺也不是很方便逐行把文件讀完。
寫起了循環,感覺應該沒錯,但是每次SSP都立刻就停止響應了,也不清楚是文件行數太多還是別的地方有問題(比如說我也不清楚FREAD返回值-1這個能不能當做分歧用)。
未完成品(也不好意思這麼說)請容我單獨放在下面……

大體上,希望能夠得到指點來解決幾個問題:
一、是否有連續讀取文件當中的100行以上而不會顯得很慢或者卡死的辦法(我想至少要能夠讀完一個首字母的內容吧)二、能不能算好文件行數,然後隨機任何一行這個文件內容呢?因為測驗比較特殊,不能檢索之類str

、有沒有更加高效的辦法能夠完成這個功能覺得自己這種什麽不會這個程度
四、如果查找讀取當中比較耗費時間,怎麼一個等待時間一樣loading事件,影響計時器


另外就是問一下如果在這個功能當中涉及大量陣列運算,到底會吃內存吃到什麽程度……

TOP

總之……就是非常,非常蠢的吧【。全局還是非全局變量什麽的也許我自己再去調整
請幫一下我這個廢渣。

//abrogation|n.取消,廢除
//↑大概dict.txt當中是這種感覺

//英翻中測驗
OnWordTestEnCh
{
        _file = "dic\dict.txt";//引用文档
        FOPEN(_file, "r");

//大概這裡就是不會寫而導致死循環的地方
//本來是想把讀取的內容寫為_dictionary的文本,然後存入名為_content的陣列,再隨機從裏面抽取元素

        _right = _content        //抽出正解和不正解
        _wrong1 = _content
        _wrong2 = _content
        _wrong3 = _content
        while _wrong1 == _right
        {_wrong1 = _content}
        while _wrong2 == _wrong1 || _wrong2 == _right
        {_wrong2 = _content}
        while _wrong3 == _wrong1 || _wrong3 == _wrong2 || _wrong3 == _right
        {_wrong3 = _content}
        _right = SPLIT(_right,'|')//分割正解
        _question = _right[0]
        answer = _right[1]
        _wrong1 = SPLIT(_wrong1,'|')//分割不正解,只留下需要的部份
        _wrong2 = SPLIT(_wrong2,'|')
        _wrong3 = SPLIT(_wrong3,'|')
        _wrong1 = _wrong1[1]
        _wrong2 = _wrong2[1]
        _wrong3 = _wrong3[1]
        _optionpool = "answer,_wrong1,_wrong2,_wrong3"        //收入答案池
        _a = "\![*]A.\q[_optionpool,WORDCHOOSE]"        //生成选项abcd,这样每次正解所在的位置都不同
        _b = "\![*]B.\q[_optionpool,WORDCHOOSE]"
        _c = "\![*]C.\q[_optionpool,WORDCHOOSE]"
        _d = "\![*]D.\q[_optionpool,WORDCHOOSE]"
        while _a == _b
        {_b = "\![*]B.\q[_optionpool,WORDCHOOSE]"}
        while _a == _c || _b == _c
        {_c = "\![*]C.\q[_optionpool,WORDCHOOSE]"}
        while _a == _d  || _b == _d  || _c == _d
        {_d = "\![*]D.\q[_optionpool,WORDCHOOSE]"}
        //最後輸出
        //時間計算reset
        timer = 4
        "\*\_q單詞%_question的正確意思是\n\n/
        %(_a)  %(_b)  %(_c)  %(_d)\_q\n\n"
}

OnSecondChange
{
if timer >0
{timer --}
}

OnChoiceSelectEx
{
        if reference1 == "WORDCHOOSE"
        {
                if reference0 == answer//正解
                {
                        correct ++
                        questionaire ++
                        if timer > 0
                        {timebonus ++}
                        ""
                        --
                        "嗯嗯,好像是那樣。"
                }
                else//不正解
                {
                        questionaire ++
                        "\0"
                        --
                        "欸……是這樣的嗎……"
                }
                --
                "\![*]\q[下一題,OnWordTestEnCh]\![*]\q[到此為止,ResultCount]"
        }
        elseif reference1 == "ResultCount"
        {
        //獲取出題數和答對數
        memoryout = memoryout + correct + timebonus
        "\0\s[3]這次的正確率是……%correct/%questionaire。\n\_q(得到獎勵%(correct+timebonus)點)\n\n\![*]\q[完畢,OnWordTestEnd]\_q"
        }
        else
        {EVAL("%(reference1)")}
}

[[i] 本帖最後由 Accveronica 於 2013-3-7 01:18 編輯 [/i]]

TOP

forjane的开心知识问答辞书符合这个功能吧,橘花中的happyquest.dic.字典文件题目用标识符加序号标记,如◇1,◇2,◇3,在读取程式中再用"◇" _in_ _buff统记数量,用RAND(数量)回传给读取程式。就达到了随机读取某题的效果,至于选项可以用#加选项编号标识,答案写在题目最后,也用#加选项编号标识,然后在菜单用for _i = 1; 读取内容[_i, '#'] != ""; _i++ { “'\q[◇'读取内容[_i, '#'] ,计分程式,选项编号,答案]"; '}来显示选项。
另外说明一下,所有的卡死都是由于死循环造成的,死机也不例外。

TOP

其實我是希望每次給出的選項都不一樣,所以可能不能照著那樣的模式搬過來。而且要寫那麼多題目的話都不如直接把單詞表在辭書裏面打成陣列……
我試著做了行數統計,但是不知道爲什麽有寫while和_buff != -1這樣的循環判斷后立刻就會卡死。
將文件的內容全部讀取的話,FREADBIN和FREADENCODE似乎是可以的,但在YAYA内部沒有辦法從二進制、URL编码和Base64轉回文本的办法……?

TOP

誠如fancyang所說的,寫while和_buff != -1這樣的循環判斷后就會卡死是因為死循環。
像\q這樣的sakurascript,在yaya處理時不過是個字串。
我想你多半是以為選了後會改變yaya中的變數值,所以寫了 {_b = "\!
  • B.\q[_optionpool,WORDCHOOSE]"}
    其實_b就是後面的字串"\!
  • B.\q[_optionpool,WORDCHOOSE]",當_a不等於這個字串,那麼循環就不會結束。

    另外,頻繁讀取這樣的數據的話用簡易資料庫SAORI - sqlori(壇裡有)會比較有效率。
    大概吧。。。
  • 皮格马利翁效应(Pygmalion Effect):只要有爱,伪春菜也能和人类一样.

    TOP

    後來想到既然不會死循環乾脆一開始放陣列算了,把整個字典文件用正則替換添上了引號還是很快的(完全不愉快的展開)。

    但是不理解為何那個while會是死循環呢……難道說就算寫再多次FREAD,還是僅僅讀了最前面的一行?

    其實那個選項出的是另一種問題……前面的讀取四個隨機正確的情況下,四個選項也會以同樣的文本內容輸出,雖然操作起來還是有正誤答案之分。這是我犯蠢沒有把_optionpool做成陣列,用了ANY+while之後就好了(大概也有更簡單的辦法)。

    我一直很不會用SAORI,相關的東西因為感覺編程方面很難所以不敢貿然下手去寫,SQL就邊學邊慢慢研究吧(這是一個會以年為單位想問題的人對不起

    TOP

    最近在做橘花的日语单词学习功能,单词测试马上就要完成了,可能功能上跟你的相似,如果还是不明白为何死循环的话,可以把这部分代码贴出来,我帮你看看问题出在哪.当然,你也可以参考我完成了的辞书

    TOP



    當前時區 GMT+8, 現在時間是 2018-8-17 04:11

    Processed in 0.013476 second(s), 8 queries, Gzip enabled.

    清除 Cookies - 聯繫我們 - 中文偽春菜後援會 - Archiver - WAP - TOP - 界面風格