为何GML中file_text_read_string无法正常工作?
问题原因分析
核心问题是文件指针位置错误:
- 第一个
while循环里,你通过file_text_readln(file)逐行读取直到文件末尾,此时文件的读取指针已经移动到了文件最后(EOF位置)。 - 后续的
for循环尝试从同一个file句柄读取内容时,因为指针已经在末尾,file_text_read_string(file)只能读到空字符串。 - 你用
buffer_load读取文件是独立操作,它直接从文件开头加载内容,和之前file_text句柄的指针位置无关,所以变量s能正确获取内容,但这部分代码对填充数组没有帮助。
修正方案
方案1:重置文件指针到开头
统计完行数后,用file_text_seek(file, 0)把指针移回文件开头,再执行读取数组的循环:
lines= 0 var file = file_text_open_read("mygame.txt"); if (file!= -1){ // 统计行数 while (!file_text_eof(file)) { file_text_readln(file); lines++; } // 重置文件指针到开头 file_text_seek(file, 0); // 读取内容到数组 for (var i = 0; i < lines; ++i){ arr[i] = file_text_read_string(file); file_text_readln(file); } file_text_close(file); }
方案2:重新打开文件读取
统计行数后关闭文件,再重新打开一次读取内容:
lines= 0 var file = file_text_open_read("mygame.txt"); if (file!= -1){ // 统计行数 while (!file_text_eof(file)) { file_text_readln(file); lines++; } file_text_close(file); // 重新打开文件读取内容 file = file_text_open_read("mygame.txt"); for (var i = 0; i < lines; ++i){ arr[i] = file_text_read_string(file); file_text_readln(file); } file_text_close(file); }
方案3:用buffer读取后拆分字符串(更高效)
既然已经能用buffer读取完整内容,直接把字符串按换行符拆分到数组,省去两次读取文件的操作:
var file_buffer = buffer_load("mygame.txt"); var s = buffer_read(file_buffer, buffer_string); buffer_delete(file_buffer); // 按换行符拆分字符串到数组 arr = string_split(s, "\n"); // 注意:如果文件末尾有空行,可过滤空元素 for(var i = array_length(arr)-1; i >=0; i--){ if(arr[i] == "") array_delete(arr, i, 1); }
内容的提问来源于stack exchange,提问作者trs11
相关产品推荐
相关产品推荐

