6

ファイルを開こうとして、そこから読み取ろうとしていますが、いくつか問題があります。

FILE *libFile = fopen("/Users/pineapple/Desktop/finalproj/test242.txt","r");
char wah[200];
fgets(wah, 200, libFile);
printf("%s test\n", wah);

これは次のように出力します:私のファイルの内容ではなく、\ 377\376Nテスト。

なぜですか?

完全なコード:

#import <Cocoa/Cocoa.h>
#import <stdio.h>

int main(int argc, char *argv[])
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

FILE *libFile = fopen("/Users/pineapple/Desktop/finalproj/test242.txt","r");
if(libFile){
char wah[200];
fgets(wah, 200, libFile);
printf("%s test\n", wah);
    }
[pool drain];
return 0;

}

また、test242.txtには200文字を超える文字は含まれていません。

4

6 に答える 6

15

これがObjective-Cの場合は、次のようなことをしてみませんか。

NSFileHandleを使用します。

NSString * path = @"/Users/pineapple/Desktop/finalproj/test242.txt";
NSFileHandle * fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
NSData * buffer = nil;
while ((buffer = [fileHandle readDataOfLength:1024])) {
  //do something with the buffer
}

またはNSStringを使用します。

NSString * fileContents = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

または、行ごとに読む必要がある場合:

NSFileHandleから1行ずつデータを読み取る方法は?

IMO、非常に非常に正当な理由がない限り、経営幹部レベルのfileIO関数にドロップダウンする必要はありません(つまり、を使用してファイルを開くO_SHLOCKなど)。

于 2010-11-17T20:04:38.513 に答える
6

ファイルはUTF-16(Unicode)に保存されます。ファイルの最初の文字は「L」です。これはコードポイント0x4Cです。ファイルの最初の4バイトはですFF FE 4C 00。これはバイト順マーク(BOM)であり、UTF-16で2バイトとしてエンコードされた文字Lです。

fgets'\n'Unicodeに対応していないため、バイト0x0Aである改行文字を探します。ほとんどの場合、これはUnicode改行の最初のバイト(2バイト0A 00)で発生しますが、U + 010A(LATIN CAPITAL LETTER A WITH DOT ABOVE)などの他の多くの非改行文字でも発生する可能性があります。グルムキー文字またはグジャラティ文字(U+0A00からU+0AFF)。

ただし、いずれの場合でも、最終的にバッファに格納されるデータにwahは多くのnullが埋め込まれており、のようになりFF FE 4C 00 47 00 4F 00 4F 00 0A 00ます。NUL(0x00)はC文字列ターミネータであるため、を使用してこれを出力しようとprintfすると、最初のnullで停止し、表示されるのは。だけです\377\376L\377\376バイトの8進表現ですFF FE

これに対する修正は、テキストファイルをISO8859-1やUTF-8などのシングルバイトエンコーディングに変換することです。シングルバイトエンコーディング(UTF-8を除く)ではUnicode文字の全範囲をエンコードできないため、Unicodeが必要な場合は、UTF-8を使用することを強くお勧めします。または、プログラムをUnicode対応に変換することもできますが、そうすると、多くの標準ライブラリ関数(やなど)を使用できなくなりfgets、の代わりにどこでもprintf使用する必要があります。wchar_tchar

于 2010-11-17T20:41:17.453 に答える
3

すべてのファイルを読んでもかまわない場合は、次のようにすることができます。

NSData* myData = [NSData dataWithContentsOfFile:myFileWithPath];

そして、そこからのデータを使って好きなことをします。ファイルが存在しない場合はnilになります。

このファイルでテキスト(文字列)データを想定している場合は、さらに次のようなことを行ってから、NSStringとして解析できます。

NSString* myString = [[NSString alloc] initWithBytes:[myData bytes] length:[myData length] encoding:NSUTF8StringEncoding];

あなたがObjective-cに比較的慣れていないことを述べたので、NSStringsをかなりうまく検索することができます。詳細については、こちらをご覧ください。

于 2010-11-17T19:57:38.900 に答える
1

私もこれが欲しかったのですが、「代わりにこれを行う」では質問に答えられないと思いました。以下に実際の例を示します。fgetsは\n区切り文字を読み取り、テキストに追加することに注意してください。

NSString * fName = [[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"txt"];
FILE *fileHandle = fopen([fName UTF8String],"r");
char space[1024];
while (fgets(space, 1024, fileHandle) != NULL)
{
    NSLog(@"space = %s", space);
}

fclose(fileHandle);
于 2013-04-28T00:01:03.017 に答える
0
 printf("%s test\n");

文字列をprintfに渡していない。試す

 printf("%s test\n", wah);

また、ファイルに200文字を超える行が含まれている場合、fgetsは200文字をワウに読み込みます-次にNULを最後に追加します。これはワウの終わりから外れます(200文字であると宣言したため)。ランダムなものを踏みにじると、プログラムの動作が定義されなくなり、猫に火がつく可能性があります。

于 2010-11-17T19:57:22.530 に答える
0

Slycrelはそれを手に入れました。その答えを拡張して、そのデータを文字列に変換する別の(私の意見では、より簡単な)方法を次に示します。

NSString *myFileString = [[NSString alloc] initWithData:someData encoding:NSUTF8StringEncoding];

これにより、指定されたNSDataを使用して新しいNSStringが直接宣言されます。

于 2011-03-23T01:59:56.573 に答える