[解決済み] テキストファイルの読み方を教えてください。重複
2022-11-25 21:16:30
質問
私はGolangを使って、"file.txt"を読み込んで、その内容を変数に格納しようとしています。以下は私が試したことです...
package main
import (
"fmt"
"os"
"log"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
fmt.Print(file)
}
ファイルが正常に読み込まれ os.Open の型を返します。 *os.ファイル
どのように解決するのですか?
何をしようとしているかによります。
file, err := os.Open("file.txt")
fmt.print(file)
&{0xc082016240} と出力されるのは、ファイルディスクリプタのポインタの値を出力しているからです(
*os.File
) のポインタの値を表示しているためで、ファイルの内容を表示しているわけではありません。ファイルの内容を取得するには、次のようにします。
READ
をファイル記述子から取得します。
ファイルの内容をすべて(バイト単位で)メモリに読み込む。
ioutil.ReadAll
package main
import (
"fmt"
"io/ioutil"
"os"
"log"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
b, err := ioutil.ReadAll(file)
fmt.Print(b)
}
しかし、ファイルサイズが大きい場合、バッファサイズ分のチャンクを読み込む方がメモリ効率が良い場合があります。
io.Reader.Read
から
*os.File
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
buf := make([]byte, 32*1024) // define your buffer size here.
for {
n, err := file.Read(buf)
if n > 0 {
fmt.Print(buf[:n]) // your read buffer.
}
if err == io.EOF {
break
}
if err != nil {
log.Printf("read %d bytes: %v", n, err)
break
}
}
}
その他、標準のutilパッケージも利用できます。
bufio
試しに
Scanner
. A
Scanner
はトークンであるセパレータでファイルを読み取ります。
デフォルトでは、スキャナはトークンを改行で進めます(もちろん、スキャナがファイルをトークン化する方法をカスタマイズすることができます。 bufioテスト ).
package main
import (
"fmt"
"os"
"log"
"bufio"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
scanner := bufio.NewScanner(file)
for scanner.Scan() { // internally, it advances token based on sperator
fmt.Println(scanner.Text()) // token in unicode-char
fmt.Println(scanner.Bytes()) // token in bytes
}
}
最後に、この素晴らしいサイトも参考にしたいと思います。 go-langファイルのチートシート . これはgo-langでのファイル操作に関連するほとんどすべてのことを網羅しているので、役に立つと思います。
関連
-
[解決済み] Goでマップにキーが含まれているかどうかを確認するには?
-
[解決済み] goで文字列の連結を効率的に行う方法
-
[解決済み] Goでファイルが存在するかどうかを確認する方法は?
-
[解決済み] サーバーでSSLが有効になっていない
-
[解決済み] 単一値コンテキストにおける複数値
-
[解決済み] Goプログラムで静的リソースをバンドルする最良の方法は何ですか?
-
[解決済み] スライスを格納する interface{} 上の範囲
-
[解決済み] テンプレートでマップを繰り返し処理する
-
[解決済み] あるプログラムの依存ファイルをすべて取得する方法
-
[解決済み] ローカルファイルからio.Readerを作成する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ファイル全体を文字列変数に読み込むには?
-
[解決済み] time.Sleepを使わずにすべてのゴルーチンが終了するのを待つには?
-
[解決済み] ゴルーチンの停止方法
-
[解決済み] スライスを宣言するのか、スライスを作るのか?
-
[解決済み] オブジェクトのプロパティを二重引用符で囲んで使用するには?
-
[解決済み] Goエラー処理テクニック【終了しました
-
[解決済み] 文字列を小文字に変換する方法を教えてください。
-
[解決済み] チャネルの要素数
-
[解決済み] golangにおけるバックティック(``)とダブルクォート("")の違いは何ですか?
-
[解決済み] Goでマップをクリアするには?