Как я могу записать в файл построчно в Swift 4 - PullRequest
0 голосов
/ 26 сентября 2019

Мне нужна помощь, чтобы понять, как многократно записывать в один и тот же открытый выходной файл.Я использую Swift 4.2.Мои поиски и тесты обнаружили только код, который записывает одну текстовую строку в файл, а затем закрывает файл.Следующее открытие перезаписывает последнее.Пример показан ниже.

Проблема в том, что мне нужно иметь возможность писать большое количество записей (скажем, 1,5 миллиона) и выполнять вычисления для каждой записи непосредственно перед ее записью в файл.Это неосуществимо, когда код будет записан только один раз перед закрытием.Я называю это «запись построчно», как и наоборот, «читать построчно».

Я пытался найти опцию в различных операторах записи Swift и SO сообщениях, но, похоже, все ориентировано на запись, а затем закрытие файла.Я попытался открыть для добавления, но это не сработало, и в любом случае кажется неэффективным открывать, закрывать, заново открывать и добавлять каждый раз, когда я хочу записать в файл.Я попробовал некоторый C-код в Swift, используя open (… и freopen (…), но не смог получить то, на что компилятор не жаловался. Надеюсь, есть способ сделать все это в Swift. Следующий код прекрасно работает для одногоwrite.

let file0 = “test_file.txt”
let s0 = ("This is a test line of text")
do {
  try s0.write(to: NSURL(fileURLWithPath: file0) as URL, atomically: false, encoding: String.Encoding.utf8)
} catch {
  print("Problem writing to file0")
}

Как я могу адаптировать этот фрагмент кода для записи строки, а затем другой, другой и т. д., и перед закрытием файла, когда все будет сделано? Если нет, то есть ли код Swift, которыйбудет делать работу?

1 Ответ

0 голосов
/ 27 сентября 2019

Ниже приведены основные компоненты кода, необходимые для записи в файл построчно в Swift.Сначала идет некоторый код управления файлами для создания файла, если он не существует, затем код для печати серии примеров операторов, затем код для печати в файл в цикле и, наконец, закрытие файла.Этот код работал правильно в Swift 4.2.Разница между этим и описанным методом заключается в том, что операторы write в этом коде используют метод fileHandle!и вопрос показывает метод строки Swift.

print("Swift_Write_to_File_Test_1")

var outFilename: NSString = "test_file.txt"

// Begin file manager segment
// Check for file presence and create it if it does not exist
let filemgr = FileManager.default
let path = filemgr.urls(for: FileManager.SearchPathDirectory.documentDirectory, in:     FileManager.SearchPathDomainMask.userDomainMask).last?.appendingPathComponent(outFilename as String)
if !filemgr.fileExists(atPath: (path?.absoluteString)!) {
filemgr.createFile(atPath: String(outFilename),  contents:Data(" ".utf8), attributes: nil)
}
// End file manager Segment

// Open outFilename for writing – this does not create a file
let fileHandle = FileHandle(forWritingAtPath: outFilename as String)

if(fileHandle == nil)
{
print("Open of outFilename forWritingAtPath: failed.  \nCheck whether the file already exists.  \nIt should already exist.\n");
exit(0)
}

var str: NSString = "2. Test string from NSString.\n";
var str0: String = "3. Test string from a Swift String.\n"
var str1: NSString = "4. Test string from NSString.\n";

fileHandle!.write("1. Text String in-line with code statement.\n".data(using: .utf8)!)
fileHandle!.write(String(str).data(using: .utf8)!)
fileHandle!.write(str0.data(using: .utf8)!)
fileHandle!.write(String(str1).data(using: .utf8)!)
fileHandle!.write("5. Text String in-line with code statement.\n".data(using: .utf8)!)
fileHandle!.write("6. Text in a loop follows: \n".data(using: .utf8)!)
for i in 0...5
{
    //Assemble a string then write it to the file.
    var s0: String = ""
    s0 = String(i)
    s0.append("  ... some text here.\n")
    fileHandle!.write(s0.data(using: .utf8)!)
}
// End of file-writing segment 


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