Почему моя командная строка pgm не видит этот файл? - PullRequest
0 голосов
/ 03 апреля 2011

Очень странная проблема. Я тестировал свою маленькую программу командной строки, которая считывает файл и анализирует его, и он отлично работает с моими тестовыми данными, но когда я нашел реальную вещь, он не смог найти файл.

Исходный файл представлял собой текстовый файл, составленный путем редактирования текста, и фактический файл был сохранен из Microsoft Word в формате MS-Dos. Когда я попытался прочитать файл MS Word, он не смог его найти. Я не получил ошибку, но вернул нулевую строку из метода загрузки файла. Затем я переименовал свой тестовый файл в то же имя, и он получил исходные тестовые данные. А? В худшем случае, я подумал, что я вижу какие-то странно выглядящие данные, загруженные в мою строку ... не ноль.

Вот стилизованная часть фрагмента кода. Пожалуйста, игнорируйте код «поймать и отпустить» вокруг строки данных NSString ... Я понимаю, что мне не нужно делать это таким образом, и это не главное.

имя файла данных установлено в «config1.txt».

(NSString*) OpenEntryFile: (NSString*) pathname withdatafilename: (NSString*) datafilename {    

NSStringEncoding encoding;
NSError* error = nil;
NSString* inputdatafile;
NSString* response;
NSString *homeDir    = NSHomeDirectory();

NSString *fullPath = [homeDir stringByAppendingPathComponent:datafilename];

filepointer = 0;
[Datafile release];
inputdatafile = [NSString stringWithContentsOfFile: fullPath usedEncoding:&encoding error:&error];

Datafile = [inputdatafile copy];

response = [NSMutableString stringWithString: @"OK"];

if (error) {response = [NSMutableString stringWithString: @"ERROR"];};

if ([Datafile length] < 60) {response = [NSMutableString stringWithString: @"SHORT"];};

return response;
}

1 Ответ

28 голосов
/ 03 апреля 2011

Этот код имеет ряд проблем;

  • Datafile должно быть dataFile

  • if(error) не так; только проверяя возвращаемое значение, вы можете узнать, была ли сгенерирована ошибка.

  • нет необходимости использовать NSMutableString для ваших ответов. Просто используйте константную строку напрямую.

  • нет необходимости копировать данные, прочитанные с помощью stringWithContentsOfFile:; просто сохраните полученную строку (если она у вас есть).

  • , если вы получаете nil для inputdatafile, то будет сгенерирована ошибка. То есть возвращаемая строка не может быть nil без error, содержащей описание проблемы.

т.е. всегда выводит либо строку, либо ошибку:

if (inputdatafile)
    NSLog(@"%@", inputdatafile);
else
    NSLog(@"error %@", error);
<Ч />

Из комментария:

 if ([error code]) {response = [NSMutableString stringWithString: @"ERROR"];}

Это совершенно неправильно .

Правила таковы, что необходимо проверить возвращаемое значение до проверки ошибки . Всегда и без исключения.

В противном случае произойдет сбой и другое ошибочное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...