#include<stdio.h>int achar b,c[100]int main(){FILE * fp1 = fopen("input.ini", "r")//打开输入文件FILE * fp2 = fopen("output.ini", "w")//打开输出文件if (fp1==NULL || fp2==NULL) {//若打开文件失败则退出puts("不能打开文件!") rturn 0 }fscanf(fp1,"%d",&a)//从输入文件读取一个整数b=fgetc(fp1)//从输入文件读取一个字符fgets(c,100,fp1)//从输入文件读取一行字符串 printf("%ld",ftell(fp1))//输出fp1指针当前位置相对于文件首的偏移字节数 fputs(c,fp2)//向输出文件写入一行字符串fputc(b,fp2)//向输出文件写入一个字符fprintf(fp2,"%d",a)//向输出文件写入一个整数 fclose(fp1)//关闭输入文件fclose(fp2)//关闭输出文件,相当于保存return 0}
我以前用过一个,你看着合适可以拿去用。特点是只读,而且不适合太大的文件(因为要全部加载到内存里)。
package ini
import (
"bufio"
"io"
"os"
"strconv"
"strings"
)
type section map[string]string
type File struct {
sections map[string]section
}
func NewFile(path string) (*File, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
return New(f), nil
}
func New(f io.Reader) *File {
m := make(map[string]section)
r := bufio.NewReader(f)
sec := ""
var line string
var err error
for err == nil {
line, err = r.ReadString('\n')
line = strings.TrimSpace(line)
if line == "" || line[0] == '' {
continue
}
if line[0] == '[' &&line[len(line)-1] == ']' {
sec = line[1 : len(line)-1]
_, ok := m[sec]
if !ok {
m[sec] = make(section)
}
continue
}
if sec == "" {
continue
}
pair := strings.SplitN(line, "=", 2)
if len(pair) != 2 {
continue
}
key := strings.TrimSpace(pair[0])
val := strings.TrimSpace(pair[1])
if key == "" || val == "" {
continue
}
m[sec][key] = val
}
return &File{m}
}
func (p *File) Sections() []string {
s := make([]string, len(p.sections))
i := 0
for k, _ := range p.sections {
s[i] = k
i++
}
return s
}
func (p *File) HasSection(section string) bool {
_, ok := p.sections[section]
return ok
}
func (p *File) Keys(sec string) []string {
m, ok := p.sections[sec]
if !ok {
return nil
}
keys := make([]string, len(m))
i := 0
for key, _ := range m {
keys[i] = key
i++
}
return keys
}
func (p *File) GetString(sec, key, def string) string {
m, ok := p.sections[sec]
if !ok {
return def
}
v, ok := m[key]
if !ok {
return def
}
return v
}
func (p *File) GetInt(sec, key string, def int) int {
m, ok := p.sections[sec]
if !ok {
return def
}
v, ok := m[key]
if !ok {
return def
}
i, err := strconv.ParseInt(v, 10, 32)
if err != nil {
return def
}
return int(i)
}
func (p *File) GetUint(sec, key string, def uint) uint {
m, ok := p.sections[sec]
if !ok {
return def
}
v, ok := m[key]
if !ok {
return def
}
i, err := strconv.ParseUint(v, 10, 32)
if err != nil {
return def
}
return uint(i)
}
func (p *File) GetBool(sec, key string, def bool) bool {
m, ok := p.sections[sec]
if !ok {
return def
}
v, ok := m[key]
if !ok {
return def
}
return v != "0"
}
go run 或者 go build后在配置目录的相对路径上执行假设当前目录如下:
├─config
│ │ main.go
│ │
│ └─file // 配置文件目录
│ config.ini
│
也就是说无论你是go run或者build后的执行程序,都应该在你执行目录下
有该配置文件路径如file/config.ini
否则就会发生以下错误, 无法读取配置文件
panic: Error:can not read file "./file/config.ini"
使用绝对路径读取配置文件
如果配置文件动态的话, 具体怎么传入 配置文件路径
go-bindata 把配置文件打包进去
5.1 使用远程配置中心去读取配置