swift - 创建多行文本并将其写入文本文件(CSV)?
问题描述
我正在尝试为用户创建一种登录方式并将其用户名和密码存储在文本文件中。这是一个学校项目,所以它没有安全存储,我认为我没有时间设置/学习如何序列化数据。我遇到问题的主要部分是尝试将数据写入 CSV,以便稍后根据从文本文件接收到的数据将用户的分数拆分为一个数组。
我尝试了另一种写入文本文件的方法:
writeString.data(using: String.Encoding.utf8)?.write(to: fileURL, options: Data.WritingOptions.withoutOverwriting)
但这似乎对我不起作用
struct UserAccount: Codable {
var username: String
var password: String
var scores: [Int]
}
var user = UserAccount(username: "", password: "", scores: [0])
func writeTextFile(_ user: UserAccount) {
//Creating text file to read and write user's data (username, password, and score values)
let fileName = "UserDataQuizApp"
let dir = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
do {
let fileManager = FileManager.default
if fileManager.fileExists(atPath: "UserDataQuizApp") {
try fileManager.removeItem(atPath: fileName)
}
} catch {print("error when deleting \(fileName)") }
// If the directory was found, we write a file to it and read it back
if let fileURL = dir?.appendingPathComponent(fileName).appendingPathExtension("txt") {
print("The path is: \(fileURL)")
do {
try user.username.write(to: fileURL, atomically: false, encoding: .utf8)
try ",".write(to: fileURL, atomically: false, encoding: .utf8)
try user.password.write(to: fileURL, atomically: false, encoding: .utf8)
for i in 0 ... user.scores.count {
try ",".write(to: fileURL, atomically: true, encoding: .utf8)
try String(user.scores[i]).write(to: fileURL, atomically: true, encoding: .utf8)
}
} catch {
print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription)
}
}
}
将数组写入文本文件现在根本不起作用,因为它说索引超出范围,但是当我将其注释掉并尝试只写入用户名和密码时,只有密码会在文件中我检查了它。我期待用户名,逗号,然后是密码
解决方案
崩溃的原因是一致的for i in 0 ... user.scores.count
,它应该是for i in 0 ..< user.scores.count
or for score in user.scores
。
您正在尝试将每个文本写入文件。这意味着只有最后一个write(to:..
才会生效。写入的所有内容都将被覆盖。
要解决此问题,请创建一个包含所有信息的字符串,然后将其写入文件。例如 write 函数应该是这样的:
func writeTextFile(_ user: UserAccount) {
//Creating text file to read and write user's data (username, password, and score values)
let fileName = "UserDataQuizApp"
let dir = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
do {
let fileManager = FileManager.default
if fileManager.fileExists(atPath: "UserDataQuizApp") {
try fileManager.removeItem(atPath: fileName)
}
} catch {print("error when deleting \(fileName)") }
// If the directory was found, we write a file to it and read it back
if let fileURL = dir?.appendingPathComponent(fileName).appendingPathExtension("txt") {
print("The path is: \(fileURL)")
do {
var contents = [user.username, user.password]
contents.append(contentsOf: user.scores.map { "\($0)"})
let string = contents.joined(separator: ",")
print("contents \(string)")
try string.write(to: fileURL, atomically: false, encoding: .utf8)
} catch {
print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription)
}
}
}
推荐阅读
- reactjs - 将引导站点转换为 React 的问题
- java - 如何在 Vaadin TextField 中呈现 html 内容
- javascript - 如何让 webpack treeshake 我的 ES6 模块?
- javascript - 在 Google Apps Script 上使用 Google Script API 获取开发者元数据
- docker-compose - 如何在 docker-compose 中运行多个网络服务器
- php - 准备好的语句在执行时失败
- javascript - 从 Firebase 托管到 Firebase 功能的请求被 CORS 阻止
- javascript - 为阅读更多/更少按钮截断内联 HTML
- angular - 如何获取选择选项的选定值?
- r - RDCOMClient + Outlook 电子邮件搜索使用 R 中的日期间隔