Dmitry Telenkov vor 1 Tag
Ursprung
Commit
a8e460fe61

+ 38 - 0
go/stepik/3/bufio.go

@@ -0,0 +1,38 @@
+package main
+
+import (
+	"bufio"
+	"io"
+	"os"
+	"strconv"
+)
+
+func main() {
+	foo1()
+	/*
+		reader := bufio.NewReader(os.Stdin)
+		var sum int
+
+		for {
+			line, _, err := reader.ReadLine()
+			if err == io.EOF || len(line) == 0 {
+				break
+			}
+			num, _ := strconv.Atoi(string(line))
+			sum += num
+
+		}
+
+		io.WriteString(os.Stdout, strconv.Itoa(sum))
+	*/
+}
+
+func foo1() {
+	scanner := bufio.NewScanner(os.Stdin)
+	sum := 0
+	for scanner.Scan() {
+		a, _ := strconv.Atoi(scanner.Text())
+		sum += a
+	}
+	io.WriteString(os.Stdout, strconv.Itoa(sum))
+}

+ 131 - 0
go/stepik/3/bufio_example.go

@@ -0,0 +1,131 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+)
+
+func main() {
+	// readFile()
+	// writeFile()
+	// scanFile()
+	readWrite()
+}
+
+// Чтение файла построчно с bufio.Reader
+func readFile() {
+	file, err := os.Open("data.txt")
+	if err != nil {
+		fmt.Printf("Ошибка открытия файла: %v\n", err)
+		return
+	}
+	defer func() {
+		if err := file.Close(); err != nil {
+			fmt.Printf("Ошибка закрытия файла %v\n", err)
+		} else {
+			fmt.Println("Файл закрыт")
+		}
+	}()
+
+	reader := bufio.NewReader(file)
+	for {
+		line, err := reader.ReadString('\n')
+		if err != nil {
+			if err.Error() != "EOF" {
+				fmt.Printf("Ошибка чтения файла: %v\n")
+			}
+			break
+		}
+		processLine(line)
+	}
+}
+
+// Функция обработки строк
+func processLine(line string) {
+	fmt.Print(line) // здесь можно добавить любую обработку строки
+}
+
+// Буферизированная запись в файл с bufio.Writer
+func writeFile() {
+	file, err := os.Create("output.txt")
+	if err != nil {
+		fmt.Printf("Ошибка создания файла %v\n", err)
+		return
+	}
+	defer func() {
+		if err := file.Close(); err != nil {
+			fmt.Printf("Ошибка закрытия файла: %v\n", err)
+		}
+	}()
+
+	writer := bufio.NewWriter(file)
+	for i := 1; i < 100; i++ {
+		_, err := writer.WriteString(fmt.Sprintf("Строка номер %d\n", i))
+		if err != nil {
+			fmt.Printf("Ошибка записи: %v\n", err)
+			return
+		}
+	}
+
+	if err := writer.Flush(); err != nil {
+		fmt.Printf("Ошибка сброса буфера: %v\n", err)
+	}
+}
+
+// bufio.Scanner для простого чтения
+func scanFile() {
+	file, err := os.Open("data.txt")
+	if err != nil {
+		fmt.Printf("Ошибка открытия файла: %v\n", err)
+		return
+	}
+	defer file.Close()
+
+	scanner := bufio.NewScanner(file)
+	lineNumber := 1
+	for scanner.Scan() {
+		fmt.Printf("Строка %d: %s\n", lineNumber, scanner.Text())
+		lineNumber++
+	}
+
+	if err := scanner.Err(); err != nil {
+		fmt.Printf("Ошибка сканирования: %v\n", err)
+	}
+}
+
+// Комбинированное чтение и запись с bufio.ReadWriter
+func readWrite() {
+	file, err := os.OpenFile("readwriter.txt", os.O_RDWR|os.O_CREATE, 0644)
+	if err != nil {
+		fmt.Printf("Ошибка открытия файла: %v\n", err)
+		return
+	}
+	defer func() {
+		if err := file.Close(); err != nil {
+			fmt.Printf("Ошибка закрытия файла: %v\n", err)
+		}
+	}()
+
+	rw := bufio.NewReadWriter(bufio.NewReader(file), bufio.NewWriter(file))
+
+	// Чтение первой строки
+	line, err := rw.ReadString('\n')
+	if err != nil {
+		fmt.Printf("Ошибка чтения: %v\n", err)
+		return
+	}
+	fmt.Printf("Прочитано %s", line)
+
+	// Переход в конец файла для записи
+	_, err = rw.WriteString("Добавленная строка\n")
+	if err != nil {
+		fmt.Printf("Ошибка записи: %v\n", err)
+		return
+	}
+
+	// Сброс буфера
+	if err := rw.Flush(); err != nil {
+		fmt.Printf("Ошибка сброса буфера: %v\n", err)
+	}
+}

+ 3 - 0
go/stepik/3/data.txt

@@ -0,0 +1,3 @@
+1
+2
+3

+ 121 - 0
go/stepik/3/file1.go

@@ -0,0 +1,121 @@
+package main
+
+import (
+	"bytes"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"os"
+)
+
+func main() {
+	// readFile1()
+	// readFile2()
+	// readDir()
+	// foo()
+	foo2()
+}
+
+func readFile1() {
+	var data []byte
+	data, _ = ioutil.ReadFile("test_file.txt")
+	fmt.Println(data)
+}
+
+func readFile2() {
+	b := bytes.NewReader([]byte("Данные в объекте io.Reader"))
+
+	data, _ := ioutil.ReadAll(b)
+	fmt.Printf("%s\n", data)
+}
+
+func readDir() {
+	dir, _ := os.ReadDir(".")
+	for i, val := range dir {
+		fmt.Println(i, val)
+	}
+	// fmt.Println(dir)
+}
+
+func writeFile1() {
+	// func WriteFile(filename string, data []byte, perm os.FileMode) error
+}
+
+func foo() {
+	dataForFile := []byte("Тестовая строка, предназначенная для записи в файл")
+
+	// Создаем новый файл и записываем в него данные dataForFile
+	if err := ioutil.WriteFile("test.txt", dataForFile, 0600); err != nil {
+		fmt.Println("С записью в файл что-то пошло не по плану.")
+	}
+
+	// Читаем данные из того же файла
+	dataFromFile, err := ioutil.ReadFile("test.txt")
+	if err != nil {
+		fmt.Println("С чтением из файла пошло что-то не так")
+	}
+	fmt.Printf("%s", dataFromFile)
+
+	// Сравниваем исходные данные с записанными в файл и прочитанными из него
+	fmt.Printf("dataForFile == dataFromFile: %v\n", bytes.Equal(dataFromFile, dataForFile))
+
+	// Изучаем содержимое директории
+	filesFromDir, err := ioutil.ReadDir(".")
+	if err != nil {
+		fmt.Println("С чтением директории пошло что-то не так.")
+	}
+
+	for _, file := range filesFromDir {
+		// Проходим по всем найденным файлам и печатаем их имя и размер
+		fmt.Printf("name: %s, size: %d\n", file.Name(), file.Size())
+	}
+}
+
+func foo2() {
+	dataForFile := []byte("Тестовая строка, предназначенная для записи в файл")
+	file_name := "test_file.txt"
+
+	// Создаем новый файл и записываем в него данные dataForFile
+	if err := os.WriteFile(file_name, dataForFile, 0600); err != nil {
+		log.Fatal(err)
+	}
+
+	// Читаем данные из файла
+	dataFromFile, err := os.ReadFile(file_name)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	fmt.Printf("dataForFile == dataFromFile: %v\n", bytes.Equal(dataFromFile, dataForFile))
+
+	// Получаем текущую директорию
+	currentDir, err := os.Getwd()
+	if err != nil {
+		log.Fatal(err)
+	}
+	fmt.Println(currentDir)
+
+	// Изучаем содержимое директории
+	filesFromDir, err := os.ReadDir(currentDir)
+	if err != nil {
+		log.Fatal(err)
+	}
+	for _, file := range filesFromDir {
+		// Проходим по всем найденным файлам и печатаем их имя и размер
+		info, _ := file.Info()
+		fmt.Printf("|_name: %s, size: %d\n", file.Name(), info.Size())
+	}
+
+	/*
+		// Изучаем содержимое директории
+		entries, err := os.ReadDir("./")
+
+		if err != nil {
+			fmt.Println("С чтением директории пошло что-то не так.")
+		}
+
+		for _, e := range entries {
+			fmt.Println(e.Name())
+		}
+	*/
+}

+ 48 - 1
go/stepik/3/interface_task.go

@@ -2,10 +2,13 @@ package main
 
 import (
 	"fmt"
+	"strings"
 )
 
 func main() {
-	foo1()
+	batTest()
+	// ExampleStringer()
+	// foo1()
 	/*
 		value1, value2, operation := readTask()
 
@@ -61,3 +64,47 @@ func readTask() (v1, v2, op interface{}) {
 	op = "+"
 	return
 }
+
+type Animal struct {
+	Name string
+	Age  uint
+}
+
+func (a Animal) String() string {
+	return fmt.Sprintf("%v (%d)", a.Name, a.Age)
+}
+
+func ExampleStringer() {
+	a := Animal{
+		Name: "Gopher",
+		Age:  2,
+	}
+	fmt.Println(a)
+}
+
+type Battery struct {
+	capacity int
+}
+
+func (b Battery) String() string {
+	var ret string = "["
+	for i := 0; i < (10 - b.capacity); i++ {
+		ret += " "
+	}
+	for i := 0; i < b.capacity; i++ {
+		ret += "X"
+	}
+	ret += "]"
+
+	return ret
+}
+
+func batTest() {
+	// var batteryForTest Battery
+	var charge string
+	batteryForTest := Battery{}
+
+	fmt.Scan(&charge)
+	batteryForTest.capacity = strings.Count(charge, "1")
+	fmt.Println(batteryForTest)
+}

+ 24 - 0
go/stepik/3/interface_task2.go

@@ -0,0 +1,24 @@
+package main
+
+import (
+	"fmt"
+	"strings"
+)
+
+type battery uint8
+
+func (b *battery) set(str string) {
+	*b = battery(strings.Count(str, `1`))
+}
+
+func (b battery) String() string {
+	return fmt.Sprintf("[%10s]", strings.Repeat("X", int(b)))
+}
+
+func main() {
+	var batteryForTest battery
+	var str string
+	fmt.Scan(&str)
+	batteryForTest.set(str)
+	fmt.Println(batteryForTest)
+}

+ 99 - 0
go/stepik/3/output.txt

@@ -0,0 +1,99 @@
+Строка номер 1
+Строка номер 2
+Строка номер 3
+Строка номер 4
+Строка номер 5
+Строка номер 6
+Строка номер 7
+Строка номер 8
+Строка номер 9
+Строка номер 10
+Строка номер 11
+Строка номер 12
+Строка номер 13
+Строка номер 14
+Строка номер 15
+Строка номер 16
+Строка номер 17
+Строка номер 18
+Строка номер 19
+Строка номер 20
+Строка номер 21
+Строка номер 22
+Строка номер 23
+Строка номер 24
+Строка номер 25
+Строка номер 26
+Строка номер 27
+Строка номер 28
+Строка номер 29
+Строка номер 30
+Строка номер 31
+Строка номер 32
+Строка номер 33
+Строка номер 34
+Строка номер 35
+Строка номер 36
+Строка номер 37
+Строка номер 38
+Строка номер 39
+Строка номер 40
+Строка номер 41
+Строка номер 42
+Строка номер 43
+Строка номер 44
+Строка номер 45
+Строка номер 46
+Строка номер 47
+Строка номер 48
+Строка номер 49
+Строка номер 50
+Строка номер 51
+Строка номер 52
+Строка номер 53
+Строка номер 54
+Строка номер 55
+Строка номер 56
+Строка номер 57
+Строка номер 58
+Строка номер 59
+Строка номер 60
+Строка номер 61
+Строка номер 62
+Строка номер 63
+Строка номер 64
+Строка номер 65
+Строка номер 66
+Строка номер 67
+Строка номер 68
+Строка номер 69
+Строка номер 70
+Строка номер 71
+Строка номер 72
+Строка номер 73
+Строка номер 74
+Строка номер 75
+Строка номер 76
+Строка номер 77
+Строка номер 78
+Строка номер 79
+Строка номер 80
+Строка номер 81
+Строка номер 82
+Строка номер 83
+Строка номер 84
+Строка номер 85
+Строка номер 86
+Строка номер 87
+Строка номер 88
+Строка номер 89
+Строка номер 90
+Строка номер 91
+Строка номер 92
+Строка номер 93
+Строка номер 94
+Строка номер 95
+Строка номер 96
+Строка номер 97
+Строка номер 98
+Строка номер 99

+ 27 - 0
go/stepik/3/path.go

@@ -0,0 +1,27 @@
+package main
+
+import (
+	"fmt"
+	"io/fs"
+	"path/filepath"
+)
+
+func walkFunc(path string, ifno, info fs.FileInfo, err error) error {
+	/*
+		if err != nil {
+			return err
+		}
+		if info.IsDir() {
+			return nil // Проигнорируем директории
+		}
+		fmt.Printf("Name: %s\tSize: %d byte\tPath: %s\n", info.Name(), info.Size(), path)
+	*/
+	return nil
+}
+
+func main() {
+	const root = "."
+	if err := filepath.Walk(root, walkFunc); err != nil {
+		fmt.Printf("Какая-то ошибка: %v\n", err)
+	}
+}

+ 4 - 0
go/stepik/3/readwriter.txt

@@ -0,0 +1,4 @@
+string 1
+string 2
+string 3Добавленная строка
+Добавленная строка

+ 1 - 0
go/stepik/3/test.txt

@@ -0,0 +1 @@
+Тестовая строка, предназначенная для записи в файл

+ 1 - 0
go/stepik/3/test_file.txt

@@ -0,0 +1 @@
+Тестовая строка, предназначенная для записи в файл