0

open()、read()、write() で 9k バイトを読み書きしようとすると奇妙な問題が発生します。ファイルに 9k を書き込んで読み戻そうとすると、データは最大 2250 バイトしかありません。その後はすべてゼロです。

これが私のコードです(関係のないファイル名を除いて、NSDocumentDirectoryに入れているだけです):

int fp = open([appFile cStringUsingEncoding:NSASCIIStringEncoding], O_RDWR | O_CREAT, 0644);

[_detailViewController log:@"first open() returns %i (err: %i)", fp, errno];

 int data2[10000];
 int data3[10000];

 for (int i=0;i<10000;i++) data2[i] = 1;

 [_detailViewController log:@"resetting seek to 0"];

 int seekPos = lseek(fp, 0, SEEK_SET);

 result = write(fp, data2, 9000);

 [_detailViewController log:@"wrote 9k, result is %i", result];

 [_detailViewController log:@"resetting seek to 0"];

 seekPos = lseek(fp, 0, SEEK_SET);

 result = read(fp, data3, 9000);

 [_detailViewController log:@"read 9k, result is %i", result];

 [_detailViewController log:@"values of data2[2248-2252] = 0x%x 0x%x 0x%x 0x%x 0x%x", data2[2248], data2[2249], data2[2250], data2[2251], data2[2252]];

 [_detailViewController log:@"values of data3[2248-2252] = 0x%x 0x%x 0x%x 0x%x 0x%x", data3[2248], data3[2249], data3[2250], data3[2251], data3[2252]];

 close(fp);

そして、ここに奇妙な出力があります:

2013-02-13 14:08:38.290 FileTester[2800:907] first open() returns 6 (err: 3)
2013-02-13 14:08:38.295 FileTester[2800:907] resetting seek to 0    
2013-02-13 14:08:38.301 FileTester[2800:907] wrote 9k, result is 9000
2013-02-13 14:08:38.306 FileTester[2800:907] resetting seek to 0
2013-02-13 14:08:38.311 FileTester[2800:907] read 9k, result is 9000
2013-02-13 14:08:38.319 FileTester[2800:907] values of data2[2248-2252] = 0x1 0x1 0x1 0x1 0x1
2013-02-13 14:08:38.327 FileTester[2800:907] values of data3[2248-2252] = 0x1 0x1 0x0 0x0 0x0

最後の行でわかるように、データが突然ゼロになります。

私が間違っているかもしれないアイデアはありますか?read() と write() の両方が 9000 を返すということは、私を本当に惹きつけます。

4

1 に答える 1

0

ughoavgfhw (ありがとう!) が述べたように、問題はバイトと整数を混同していたことです。各 int は 4 バイトであるため、9000 バイトは 2250 int と同じです。

于 2013-02-15T18:19:18.873 に答える