Free Pascal写入文件时前序输入字符残留问题求助
问题描述
我正在开发一个简单数据库程序,使用Free Pascal 3.2.2版本,从第二次输入开始遇到问题:写入文件的第二条及第三条记录会携带前一次输入的多余字符。
运行结果显示,第二条和第三条条目包含从已写入文件的前序输入中遗留的多余字符。
程序代码如下:
program filegen; type fileRecord = Record recordName: string[59]; recordCount: longint; end; var myRecord: fileRecord; f: file of fileRecord; name: string[59]; counter: longint; begin {$I-} if ParamCount <> 1 then begin writeln('Please specify at least ONE file name to continue. Aborting...'); halt(1); end; assign(f, ParamStr(1)); rewrite(f); if IOResult <> 0 then begin writeln('Can''t open or create the file: ', ParamStr(1)); halt(1); end; write('Enter the name of the record: '); while not Eof do begin readln(name); if Length(name) = 0 then begin writeln('The name is empty. Please enter the name to continue.'); readln; continue; end; write('Enter the number: '); readln(counter); if IOResult <> 0 then begin writeln('Please enter the correct number to continue.'); readln; continue; end; myRecord.recordName := name; myRecord.recordCount := counter; write(f, myRecord); write('Enter the name of the record: '); end; close(f); end.
我尝试在write过程前清空Record内的recordName字段以及name变量,但未成功。或许我应该在写入文件前清理某些内部缓冲区。
解决方案
问题根源在于Free Pascal的**固定长度短字符串(string[59])**采用固定字节缓冲区存储,当复用myRecord变量时,若新赋值的字符串长度短于之前的,缓冲区未被覆盖的部分会残留旧字符,写入文件时这些残留内容也会被写入。
方法1:每次循环初始化整个记录
在while循环开头添加初始化代码,直接覆盖整个记录的内存空间:
while not Eof do begin FillChar(myRecord, SizeOf(myRecord), 0); // 初始化记录,清空所有字段 readln(name); // ... 后续代码保持不变
方法2:显式清空recordName字段
在给myRecord.recordName赋值前,单独清空该字符串的缓冲区:
// 用空格填充整个字符串缓冲区,确保无残留 FillChar(myRecord.recordName, SizeOf(myRecord.recordName), ' '); myRecord.recordName := name; myRecord.recordCount := counter;
原理说明
固定长度短字符串由1字节的长度标识 + 59字节的字符缓冲区组成。直接赋值较短字符串时,仅会更新长度标识和对应长度的字符,缓冲区剩余部分不会自动清零。使用FillChar可以强制覆盖整个缓冲区,彻底清除旧数据残留。
内容的提问来源于stack exchange,提问作者DonKeehot
相关产品推荐
相关产品推荐

