无法在 Visual D 中使用“std.file.readText(fileName)”读取文本文件(抛出奇怪的异常)
Unable to read a text file using `std.file.readText(fileName)` in Visual D (throws strange exception)
异常详情为:
Unhandled exception at 0x00007FF7B11A7F40 in mutation_lib.exe: 0xC0000096: Privileged instruction.
它出现在标准库源代码的这一行:
void[] read(R)(R name, size_t upTo = size_t.max)
if (isInputRange!R && isSomeChar!(ElementEncodingType!R) && !isInfinite!R &&
!isConvertibleToString!R)
{
static if (isNarrowString!R && is(immutable ElementEncodingType!R == immutable char))
return readImpl(name, name.tempCString!FSChar(), upTo); // (THIS LINE TRIGGERS EXCEPTION)
else
return readImpl(null, name.tempCString!FSChar(), upTo);
}
我传入的字符串是“prog9.asm”,它是一个与Dlanguage EXE在同一目录下的文件。
我检查了文件的编码,它是纯 ANSI / ASCII。
一个最小的异常抛出示例是这样的:
import std.stdio;
import std.file;
void main()
{
while (true) {
writeln("Enter a .asm file name: ");
auto asmFileName = readln();
auto asmSource = readText(asmFileName);
}
}
更新。我已经追踪到它了。如果我在与 EXE 相同的目录中的 windows 资源管理器中创建一个新的 test.txt
。然后我按字面意义传入字符串“test.txt”(不使用字符串变量),然后它就起作用了。
那么问题是如何从命令行解析字符串然后将其传递给 readText()
...
发现问题。在将其视为文件名之前,您需要从 asmFileName
中删除换行符:
import std.stdio;
import std.file;
import std.string;
void main()
{
while (true) {
writeln("Enter a .asm file name: ");
string asmFileName = readln();
asmFileName = strip(asmFileName);
auto asmSource = readText(asmFileName);
}
}
异常详情为:
Unhandled exception at 0x00007FF7B11A7F40 in mutation_lib.exe: 0xC0000096: Privileged instruction.
它出现在标准库源代码的这一行:
void[] read(R)(R name, size_t upTo = size_t.max)
if (isInputRange!R && isSomeChar!(ElementEncodingType!R) && !isInfinite!R &&
!isConvertibleToString!R)
{
static if (isNarrowString!R && is(immutable ElementEncodingType!R == immutable char))
return readImpl(name, name.tempCString!FSChar(), upTo); // (THIS LINE TRIGGERS EXCEPTION)
else
return readImpl(null, name.tempCString!FSChar(), upTo);
}
我传入的字符串是“prog9.asm”,它是一个与Dlanguage EXE在同一目录下的文件。
我检查了文件的编码,它是纯 ANSI / ASCII。
一个最小的异常抛出示例是这样的:
import std.stdio;
import std.file;
void main()
{
while (true) {
writeln("Enter a .asm file name: ");
auto asmFileName = readln();
auto asmSource = readText(asmFileName);
}
}
更新。我已经追踪到它了。如果我在与 EXE 相同的目录中的 windows 资源管理器中创建一个新的 test.txt
。然后我按字面意义传入字符串“test.txt”(不使用字符串变量),然后它就起作用了。
那么问题是如何从命令行解析字符串然后将其传递给 readText()
...
发现问题。在将其视为文件名之前,您需要从 asmFileName
中删除换行符:
import std.stdio;
import std.file;
import std.string;
void main()
{
while (true) {
writeln("Enter a .asm file name: ");
string asmFileName = readln();
asmFileName = strip(asmFileName);
auto asmSource = readText(asmFileName);
}
}