Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何将整个文件读入字符串变量_String_File_Go - Fatal编程技术网

String 如何将整个文件读入字符串变量

String 如何将整个文件读入字符串变量,string,file,go,String,File,Go,我有很多小文件,我不想一行一行地读 Go中是否有将整个文件读入字符串变量的函数?使用: ReadFile读取按文件名命名的文件并返回内容。成功的电话 返回err==nil,而不是err==EOF。因为ReadFile读取整个文件,所以它不处理 从读取的EOF作为要报告的错误 您将得到一个[]字节,而不是字符串。如果确实需要,可以对其进行转换: s := string(buf) 如果你真的关心连接所有这些文件的效率,我认为最好的办法是将它们都复制到相同的字节缓冲区中 buf := bytes.N

我有很多小文件,我不想一行一行地读

Go中是否有将整个文件读入字符串变量的函数?

使用:

ReadFile读取按文件名命名的文件并返回内容。成功的电话 返回err==nil,而不是err==EOF。因为ReadFile读取整个文件,所以它不处理 从读取的EOF作为要报告的错误

您将得到一个
[]字节,而不是
字符串
。如果确实需要,可以对其进行转换:

s := string(buf)

如果你真的关心连接所有这些文件的效率,我认为最好的办法是将它们都复制到相同的字节缓冲区中

buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
  f, _ := os.Open(filename) // Error handling elided for brevity.
  io.Copy(buf, f)           // Error handling elided for brevity.
  f.Close()
}
s := string(buf.Bytes())

这将打开每个文件,将其内容复制到buf中,然后关闭该文件。根据您的情况,您可能实际上不需要转换它,最后一行只是显示buf.Bytes()具有您正在查找的数据。

如果您只想将内容作为
string
,那么简单的解决方案是使用
io/ioutil
包中的
ReadFile
函数。此函数返回一段
字节
,您可以轻松地将其转换为
字符串

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    b, err := ioutil.ReadFile("file.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }

    fmt.Println(b) // print the content as 'bytes'

    str := string(b) // convert content to a 'string'

    fmt.Println(str) // print the content as a 'string'
}
我就是这样做的:

package main

import (
  "fmt"
  "os"
  "bytes"
  "log"
)

func main() {
   filerc, err := os.Open("filename")
   if err != nil{
     log.Fatal(err)
   }
   defer filerc.Close()

   buf := new(bytes.Buffer)
   buf.ReadFrom(filerc)
   contents := buf.String()

   fmt.Print(contents) 

}    

我不懂电脑,所以我写草稿。你可能清楚我说的话

func main(){
const dir=“/etc/”
filesInfo,e:=ioutil.ReadDir(dir)
var fileNames=make([]字符串,0,10)
对于i,v:=范围filesInfo{
如果!v.IsDir(){
fileNames=append(文件名,v.Name())
}
}
var fileNumber=len(文件名)
var contents=make([]字符串,文件号,10)
wg:=sync.WaitGroup{}
wg.Add(文件号)
对于i,z:=范围内容{
go func(i int){
推迟工作组完成()
buf,e:=ioutil.Readfile(fmt.Printf(“%s/%s”,dir,文件名[i]))
延迟文件。关闭()
内容[i]=字符串(buf)
}(一)
}
wg.Wait()
}

您可以使用
字符串.Builder

package main

import (
   "io"
   "os"
   "strings"
)

func main() {
   f, e := os.Open("file.txt")
   if e != nil {
      panic(e)
   }
   defer f.Close()
   b := new(strings.Builder)
   io.Copy(b, f)
   print(b.String())
}
或者,如果您不介意
[]字节
,您可以使用:

package main
import "os"

func main() {
   b, e := os.ReadFile("file.txt")
   if e != nil {
      panic(e)
   }
   os.Stdout.Write(b)
}

然后,为了构造最终字符串结果,可以在读取每个文件时使用append()将数据累积到单个字节片中,然后将累积的字节片转换为最终字符串结果。或者,您可能需要bytes.Join.Show我们如何转换它然后。。。这个问题不需要字节数组,用它打开一个html文件,我发现每一行后面都会追加一行,这会弄乱我的格式。有什么办法可以避免吗?golang是强类型的。如果您需要类型字符串而不是[]字节,那么转换是非常必要的。很高兴字符串(字节)完成了任务。嗨,io.Copy会覆盖buf的内容吗?buf的容量是多少?谢谢。复制不会覆盖,它只会不断添加到buf中,buf将根据需要增长以容纳新数据。buf具有“无限”容量。随着更多数据的添加,它将继续扩展。ioutil.Readfile将分配一个足够大的缓冲区来容纳完整的文件,而不需要重新分配。与简单地将bytebuffer附加到切片(/array)相比,使用bytebuffer真的能提高性能吗?记忆呢?区别有多大?虽然ioutil.ReadFile更简洁,因此在文件尚未打开时更可取,但是buf.ReadFrom()在您已经获得打开文件的情况下工作,因此这是一个很好的第二个答案。
package main
import "os"

func main() {
   b, e := os.ReadFile("file.txt")
   if e != nil {
      panic(e)
   }
   os.Stdout.Write(b)
}