这必须是所有程序员不时有的常见问题.如何从文本文件中读取一行?然后下一个问题是我如何写回来.
当然,大多数人在日常编程中都使用高级框架(可以在答案中使用)但有时候知道如何在较低级别进行编程也很好.
我自己知道该怎么做的C,C++以及Objective-C,但它肯定会得心应手,看看它是如何在所有流行的语言来完成,如果仅仅是为了帮助我们做出什么语言来尽我们的文件IO在一个更好的决定.特别是我认为这将是有趣的,看看它是如何在字符串操作语言完成,如:python,ruby当然perl.
所以我想在这里我们可以创建一个社区资源,我们可以为我们的配置文件加注星标,并参考我们何时需要以某种新语言进行文件I/O. 更不用说曝光我们都会得到我们日常不处理的语言.
这是你需要回答的方式:
澄清:
对语言没有特别限制.
C,C++,C#,Java,Objective-C都是伟大的.
如果你知道如何做到这一点的Prolog,Haskell,Fortran,Lisp,或Basic则请请便.
我有一个EurekaLog错误报告显示EEncodingError.日志指向TFile.AppendAllText.我打电话TFile.AppendAllText是我的这个程序:
procedure WriteToFile(CONST FileName: string; CONST uString: string; CONST WriteOp: WriteOpperation; ForceFolder: Boolean= FALSE); // Works with UNC paths
begin
if NOT ForceFolder
OR (ForceFolder AND ForceDirectoriesMsg(ExtractFilePath(FileName))) then
if WriteOp= (woOverwrite)
then IOUtils.TFile.WriteAllText (FileName, uString)
else IOUtils.TFile.AppendAllText(FileName, uString);
end;
Run Code Online (Sandbox Code Playgroud)
这是来自EurekaLog的信息.
是什么导致这种情况发生?
当我尝试下面的代码时,与D2009相比,XE2中的输出似乎不同.
procedure TForm1.Button1Click(Sender: TObject);
var Outfile:textfile;
myByte: Byte;
begin
assignfile(Outfile,'test_chinese.txt');
Rewrite(Outfile);
for myByte in TEncoding.UTF8.GetPreamble do write(Outfile, AnsiChar(myByte));
//This is the UTF-8 BOM
Writeln(Outfile,utf8string('??'));
Writeln(Outfile,'°C');
Closefile(Outfile);
end;
Run Code Online (Sandbox Code Playgroud)
在Windows 8 PC上使用XE2进行编译可以使用写字板
?? C
txt十六进制代码:EF BB BF 3F 3F 0D 0A B0 43 0D 0A
在Windows XP PC上使用D2009进行编译可以在Wordpad中进行
总结°C
txt十六进制代码:EF BB BF E6 80 BB E7 BB 93 0D 0A B0 43 0D 0A
我的问题是它为什么不同,我如何使用旧的文本文件I/O将中文字符保存到文本文件?
谢谢!
我如何将文件从磁盘上的文件读入内存中的数组?
另外,我注意到使用ReadLn只显示了第一行(看起来很明显,因为它是ReadLn,但我将如何阅读整个文本文档?)
的结果GetParent('c:\1\2\')是'c:\1\2'。
的结果GetParent('c:\1\2')是'c:\1'。
这是正常/预期的行为吗?如果是,其背后的逻辑是什么?
我想在Delphi中实现一个非常基本的任务:将字符串保存到磁盘并加载回来.这似乎是微不足道的,但是自从我升级到IOUtils之后我做了这个TWICE就遇到了问题(之前还有一次......这就是为什么我把'辉煌'的决定升级到IOUtils).
我使用这样的东西:
procedure WriteToFile(CONST FileName: string; CONST uString: string; CONST WriteOp: WriteOperation);
begin
if WriteOp= (woOverwrite)
then IOUtils.TFile.WriteAllText (FileName, uString) //overwrite
else IOUtils.TFile.AppendAllText(FileName, uString); //append
end;
Run Code Online (Sandbox Code Playgroud)
简单吧?怎么可能出错?好吧,我最近在IOUtils中遇到了另一个(另一个)错误.所以,TFile是错误的.该缺陷详述这里.
任何人都可以分享一个不是基于IOUtils的替代方案(或仅仅是你的想法/想法)并且它已知可行吗?嗯......上面的代码也为我工作了一段时间......所以,我知道如果难以保证一段代码(无论多小)将真正起作用!
另外,我真的希望让我的WriteToFile过程在可能的情况下将字符串保存到ANSI文件(uString仅包含ANSI字符),否则为Unicode.
然后ReadAFile函数应自动检测编码并正确读回字符串.
我们的想法是,仍有文本编辑器会错误地打开/解释Unicode/UTF文件.因此,只要有可能,请向用户提供一个好的旧ANSI文本文件.
所以:
- 覆盖/追加
- 尽可能保存为ANSI
- 内存效率(当加载文件为2GB时不要吃4GB内存)
- 应该使用任何文本文件(最多2GB,显然)
- 没有IOUtils(太小车有用)