OS X Yosemite 10.10.5 XCode 7.2
私は一日中、Cのワイド文字/文字列について読んで実験してきましたが、まだうまくいきません。
次のようなワイド文字のみで構成されるファイルを読み取ろうとしています。
んわらやま (Japanese)
一度に 1 文字だけを読み取り、他のファイル内にすぐに書き込みたい。
int main(int argc, const char * argv[])
{
FILE *source, *dest;
source = fopen( argv[1], "r");
if (source == NULL) {
printf ("could not open source file \n");
exit (1);
}
// if [dest] does not exist it is created
dest = fopen( argv[2], "w+");
if (dest == NULL) {
fclose(source);
printf ("could not open dest file \n");
exit (1);
}
fwide(source, 1);
fwide(dest, 1);
fileManipulator(source, dest);
fclose(source);
fclose(dest);
return 0;
}
void fileManipulator(FILE* source, FILE* dest)
{
wint_t token;
while ( WEOF != (token = getwc(source))) {
manipulateToken(token, dest);
}
}
void manipulateToken(wint_t token, FILE* dest)
{
char* pre = "- ";
char* post= " -\n";
if ( EOF == fputs(pre, dest))
{
// error handling
}
if ( WEOF == fputwc(token, dest))
{
// error handling
}
if ( EOF == fputs(post, dest))
{
// error handling
}
}
出力は次のとおりです。
- „ -
- Ç -
- ì -
- „ -
- Ç -
- è -
- „ -
- Ç -
- â -
- „ -
- Ç -
- Ñ -
- „ -
- Å -
- æ -
私の問題はおそらくデータの読み取り方にあることは理解できますが、代替案について考えると、完全に立ち往生しています。
- fgetwsを使用してみましたが、文字を別の文字から分離することはできません。
- %lsでfwscanfを使用しようとしましたが、空のファイルになってしまいました。
- 関連するマニュアルページで言及されていても、MAC OSはfgetwc実装を提供していないことに気付きました.AFAIK getwcはfgetwcのマクロ実装である必要があります。
- これが重要かどうかはわかりませんが、touchコマンドを使用してソース ファイルを作成しました。
手伝って頂けますか?
PS: 議論に関するさらなる読み物へのリンクも大歓迎です。この問題に関する文書はかなり不足しています。
XCodeの問題
この問題により、当初、 Jonathan Lefflerソリューションが機能していないと思いました。実際、コードを XCodeCMD+RまたはTerminalを介して実行すると、コードは異なる出力を生成します。
私の知る限り、ソースと宛先のパラメーターをハードコーディングしても間違った出力が生成されるため、XCodeが実行時に使用する何らかの属性/プロパティ/設定に問題があるはずです。
わかりやすくするために、コードにエクスポートされたスキームを提供しています。
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0720"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DA36663A1CCF4F8200615958"
BuildableName = "FileManipulator"
BlueprintName = "FileManipulator"
ReferencedContainer = "container:FileManipulator.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DA36663A1CCF4F8200615958"
BuildableName = "FileManipulator"
BlueprintName = "FileManipulator"
ReferencedContainer = "container:FileManipulator.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
enableAddressSanitizer = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DA36663A1CCF4F8200615958"
BuildableName = "FileManipulator"
BlueprintName = "FileManipulator"
ReferencedContainer = "container:FileManipulator.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
<CommandLineArgument
argument = "/Users/Paul/TestDirectory/Source.txt"
isEnabled = "YES">
</CommandLineArgument>
<CommandLineArgument
argument = "/Users/Paul/TestDirectory/Destination.txt"
isEnabled = "YES">
</CommandLineArgument>
</CommandLineArguments>
<AdditionalOptions>
<AdditionalOption
key = "NSZombieEnabled"
value = "YES"
isEnabled = "YES">
</AdditionalOption>
<AdditionalOption
key = "NSDOLoggingEnabled"
value = "YES"
isEnabled = "YES">
</AdditionalOption>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DA36663A1CCF4F8200615958"
BuildableName = "FileManipulator"
BlueprintName = "FileManipulator"
ReferencedContainer = "container:FileManipulator.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>