Skip to content

Commit a68deaa

Browse files
committed
#11 - go
1 parent 9cd66f2 commit a68deaa

File tree

1 file changed

+294
-0
lines changed

1 file changed

+294
-0
lines changed
Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"io"
7+
"os"
8+
"strings"
9+
)
10+
11+
/*
12+
* IMPORTANTE: Sólo debes subir el fichero de código como parte del ejercicio.
13+
*
14+
* EJERCICIO:
15+
* Desarrolla un programa capaz de crear un archivo que se llame como
16+
* tu usuario de GitHub y tenga la extensión .txt.
17+
* Añade varias líneas en ese fichero:
18+
* - Tu nombre.
19+
* - Edad.
20+
* - Lenguaje de programación favorito.
21+
* Imprime el contenido.
22+
* Borra el fichero.
23+
*
24+
* DIFICULTAD EXTRA (opcional):
25+
* Desarrolla un programa de gestión de ventas que almacena sus datos en un
26+
* archivo .txt.
27+
* - Cada producto se guarda en una línea del arhivo de la siguiente manera:
28+
* [nombre_producto], [cantidad_vendida], [precio].
29+
* - Siguiendo ese formato, y mediante terminal, debe permitir añadir, consultar,
30+
* actualizar, eliminar productos y salir.
31+
* - También debe poseer opciones para calcular la venta total y por producto.
32+
* - La opción salir borra el .txt.
33+
*/
34+
35+
func main() {
36+
// Ejercicio
37+
tempFile, err := os.Create("N0HagoNada.txt")
38+
if err != nil {
39+
fmt.Println(err)
40+
return
41+
}
42+
fmt.Println("Archivo creado con extio: ", tempFile.Name())
43+
err = tempFile.Close()
44+
if err != nil {
45+
fmt.Println(err)
46+
return
47+
}
48+
file, err := os.OpenFile("N0HagoNada.txt", os.O_APPEND|os.O_WRONLY, 0644)
49+
if err != nil {
50+
fmt.Println(err)
51+
return
52+
}
53+
_, err = file.WriteString("Nombre: Juan David \n")
54+
if err != nil {
55+
fmt.Println(err)
56+
return
57+
}
58+
_, err = file.WriteString("Edad: 31 \n")
59+
_, err = file.WriteString("Lenguaje de programación favorito: go")
60+
err = file.Close()
61+
if err != nil {
62+
fmt.Println(err)
63+
return
64+
}
65+
file, err = os.Open("N0HagoNada.txt")
66+
data, err := io.ReadAll(file)
67+
if err != nil {
68+
fmt.Println(err)
69+
return
70+
}
71+
content := string(data)
72+
fmt.Println(content)
73+
err = file.Close()
74+
if err != nil {
75+
fmt.Println(err)
76+
return
77+
}
78+
err = os.Remove(tempFile.Name())
79+
if err != nil {
80+
fmt.Println(err)
81+
return
82+
}
83+
fmt.Println("******************************* RETO *************************************************")
84+
cuentas, err := os.Create("Tienda.txt")
85+
nombreArchivo := cuentas.Name()
86+
cuentas.Close()
87+
if err != nil {
88+
fmt.Println(err)
89+
return
90+
}
91+
scanner := bufio.NewScanner(os.Stdin)
92+
for {
93+
fmt.Println("Bienvenido al inventario para la tienda de la esquina")
94+
fmt.Println("1. Añadir Producto")
95+
fmt.Println("2. Consultar producto por nombre")
96+
fmt.Println("3. Actualizar producto")
97+
fmt.Println("4. Eliminar producto")
98+
fmt.Println("Escribe 'exit' para salir")
99+
fmt.Print("Elige una opción: ")
100+
scanner.Scan()
101+
input := strings.TrimSpace(scanner.Text())
102+
if strings.ToLower(input) == "exit" {
103+
err := os.Remove(nombreArchivo)
104+
if err != nil {
105+
fmt.Println(err)
106+
return
107+
}
108+
break
109+
}
110+
switch input {
111+
case "1":
112+
// Lógica para agregar producto
113+
var nombreProducto, cantidadVendiad, precio string
114+
fmt.Print("Ingresa el nombreProducto: ")
115+
scanner.Scan()
116+
nombreProducto = scanner.Text()
117+
118+
fmt.Print("Ingresa la cantidadVendiad: ")
119+
scanner.Scan()
120+
cantidadVendiad = scanner.Text()
121+
122+
fmt.Print("Ingresa el precio: ")
123+
scanner.Scan()
124+
precio = scanner.Text()
125+
126+
construirLinea := fmt.Sprintf("%s, %s, %s \n", nombreProducto, cantidadVendiad, precio)
127+
err = agregarProducto(nombreArchivo, construirLinea)
128+
if err != nil {
129+
fmt.Println(err)
130+
return
131+
}
132+
133+
case "2":
134+
// Lógica para consultar
135+
var nombreProducto string
136+
fmt.Print("Ingresa el nombreProducto: ")
137+
scanner.Scan()
138+
nombreProducto = scanner.Text()
139+
encontrado, err := consultarProdcuto(nombreArchivo, nombreProducto)
140+
if err != nil {
141+
fmt.Println(err)
142+
continue
143+
}
144+
fmt.Println(encontrado)
145+
146+
case "3":
147+
// Lógica para actualizar
148+
var nombreProducto, cantidadVendiad, precio string
149+
fmt.Print("Ingresa el nombreProducto a actualizar: ")
150+
scanner.Scan()
151+
nombreProducto = scanner.Text()
152+
fmt.Print("Ingresa la cantidadVendiad: ")
153+
scanner.Scan()
154+
cantidadVendiad = scanner.Text()
155+
156+
fmt.Print("Ingresa el precio: ")
157+
scanner.Scan()
158+
precio = scanner.Text()
159+
construirLinea := fmt.Sprintf("%s, %s, %s \n", nombreProducto, cantidadVendiad, precio)
160+
err := actualizarlineaEnArchivo(nombreArchivo, nombreProducto, construirLinea)
161+
if err != nil {
162+
fmt.Println(err)
163+
return
164+
}
165+
166+
case "4":
167+
// Lógica para eliminar
168+
var nombreProducto string
169+
fmt.Print("Ingresa el nombreProducto: ")
170+
scanner.Scan()
171+
nombreProducto = scanner.Text()
172+
err := eliminarLineaenArchivo(nombreArchivo, nombreProducto)
173+
if err != nil {
174+
fmt.Println(err)
175+
return
176+
}
177+
178+
default:
179+
fmt.Println("Opción no válida, por favor intenta de nuevo.")
180+
}
181+
}
182+
}
183+
184+
func agregarProducto(nombre string, linea string) error {
185+
archivo, err := os.OpenFile(nombre, os.O_APPEND|os.O_WRONLY, 0666)
186+
if err != nil {
187+
return err
188+
}
189+
_, err = archivo.WriteString(linea)
190+
if err != nil {
191+
// Manejo del error
192+
return err
193+
}
194+
defer archivo.Close()
195+
return nil
196+
}
197+
func consultarProdcuto(nombre string, producto string) (string, error) {
198+
archivo, err := os.OpenFile(nombre, os.O_RDONLY, 0666)
199+
if err != nil {
200+
return "", err
201+
}
202+
defer archivo.Close()
203+
scanner := bufio.NewScanner(archivo)
204+
for scanner.Scan() {
205+
linea := scanner.Text()
206+
if strings.Contains(linea, producto) {
207+
return linea, nil
208+
}
209+
}
210+
return "", fmt.Errorf("no se encontro %s", producto)
211+
}
212+
func actualizarlineaEnArchivo(nombreArchivo, lineaBuscar, lineaNueva string) error {
213+
archivo, err := os.OpenFile(nombreArchivo, os.O_RDWR, 0666)
214+
if err != nil {
215+
return err
216+
}
217+
// Crear un archivo temporal
218+
tempArchivo, err := os.CreateTemp("", "temp")
219+
if err != nil {
220+
return err
221+
}
222+
scanner := bufio.NewScanner(archivo)
223+
var lineaActualizada bool
224+
225+
// Leer y escribir al archivo temporal
226+
for scanner.Scan() {
227+
linea := scanner.Text()
228+
if strings.Contains(linea, lineaBuscar) && !lineaActualizada {
229+
_, err = tempArchivo.WriteString(lineaNueva + "\n")
230+
lineaActualizada = true // Asegura que solo se actualice la primera coincidencia
231+
} else {
232+
_, err = tempArchivo.WriteString(linea + "\n")
233+
}
234+
if err != nil {
235+
return err
236+
}
237+
}
238+
// Verificar errores al leer el archivo
239+
if err := scanner.Err(); err != nil {
240+
return err
241+
}
242+
archivo.Close()
243+
tempArchivo.Close()
244+
// Reemplazar el archivo original con el archivo temporal
245+
err = os.Rename(tempArchivo.Name(), nombreArchivo)
246+
if err != nil {
247+
return err
248+
}
249+
return nil
250+
}
251+
252+
func eliminarLineaenArchivo(nombreArchivo, lineaBuscar string) error {
253+
archivo, err := os.OpenFile(nombreArchivo, os.O_RDWR, 0666)
254+
if err != nil {
255+
return err
256+
}
257+
// Crear un archivo temporal
258+
tempArchivo, err := os.CreateTemp("", "temp")
259+
if err != nil {
260+
return err
261+
}
262+
scanner := bufio.NewScanner(archivo)
263+
264+
// Leer y escribir al archivo temporal
265+
for scanner.Scan() {
266+
linea := scanner.Text()
267+
if strings.Contains(linea, lineaBuscar) {
268+
continue
269+
} else {
270+
_, err = tempArchivo.WriteString(linea + "\n")
271+
}
272+
if err != nil {
273+
return err
274+
}
275+
}
276+
// Verificar errores al leer el archivo
277+
if err := scanner.Err(); err != nil {
278+
return err
279+
}
280+
err = archivo.Close()
281+
if err != nil {
282+
return err
283+
}
284+
err = tempArchivo.Close()
285+
if err != nil {
286+
return err
287+
}
288+
// Reemplazar el archivo original con el archivo temporal
289+
err = os.Rename(tempArchivo.Name(), nombreArchivo)
290+
if err != nil {
291+
return err
292+
}
293+
return nil
294+
}

0 commit comments

Comments
 (0)