-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtp1.c
144 lines (123 loc) · 2.87 KB
/
tp1.c
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "gcd.h"
#define VERSION 1.1
void mensaje_ayuda() {
printf("Usage: \n");
printf(" tp1 -h \n");
printf(" tp1 -V \n");
printf(" tp1 -i in_file -o outfile \n");
printf("Options: \n ");
printf(" -V, --version Print version and quit.\n" );
printf(" -h, --help Print this information and quit. \n");
printf(" -i, --input Specify input stream/file, '-' for stdin. \n");
printf(" -o, --output Specify output stream/file, '-' for stdout \n");
printf(" -d, --decode Decode a base64-encoded file. \n");
printf("Examples: \n");
printf(" tp1 < in.txt > out.txt \n");
printf(" cat in.txt | tp1 -i - > out.txt \n");
}
int main(int argc,char* argv[]){
char* input;
char* output;
int modo_out=0; // 0: file | 1: stdout
int modo_in=0; // 0: file | 1: stdout
FILE * file_in;
FILE * file_out;
if (strcmp(argv[1], "-i")==0) {
if (strcmp(argv[2], "-")==0) {
modo_in = 1;
file_in = stdin;
}
else {
input = argv[2];
}
}
if (strcmp(argv[3], "-o")==0) {
if (strcmp(argv[4], "-")==0) {
modo_out=1;
file_out=stdout;
}
else {
output=argv[4];
}
}
if (argc == 2 && strcmp(argv[1], "-h") == 0) {
mensaje_ayuda();
return 0;
}
if (argc == 2 && strcmp(argv[1], "-V") == 0) {
printf("Versión del TP: %.1f \n", VERSION);
return 0;
}
if (modo_in==0) {
file_in = fopen(input,"r");
//verifico que abri bien el archivo
if (file_in==NULL){
return -1;
}
}
if(modo_out==0) {
file_out = fopen(output,"w");
//verifico que abri bien el archivo
if (file_out==NULL){
return -1;
}
}
struct gcd* puntero;
size_t largo_array;
int i=0;
//creo buffer para almacenar linea
char buffer[50];
if (modo_in==0) {
while(!feof(file_in)){
if ((fgets(buffer,50, file_in) != NULL) && (buffer[0] != '\n')) {
i++;
}
}
rewind(file_in);
} else {
i=100;
}
if (i < 1) {
//Cierro los archivos
if(modo_in==0){
fclose(file_in);
}
if(modo_out==0){
fclose(file_out);
}
return -1;
}
//Declaracion del arreglo
struct gcd gcds[i];
i=0;
//feof verifica si estoy en el final del archivo (devuelve True si estoy en el final)
while(!feof(file_in)){
//leo linea y asigno lo que lea a posiciones del struct
if ((fgets(buffer,50, file_in) != NULL) && (buffer[0] != '\n')) {
struct gcd* p = gcds + i;
sscanf(buffer,"%d %d", &p->num_a,&p->num_b);
i++;
}
}
puntero =gcds;
largo_array = i;
//LLAMO A EUCLIDES y le paso puntero al array y largo_array
if (largo_array > 0) {
euclides(puntero,largo_array);
}
//recorro el struct para printear la salida y escribir el .txt si hace falta
for (i=0;i<largo_array;i++){
fprintf(file_out, "GCD(%d,%d) = %d \n", gcds[i].num_a,gcds[i].num_b,gcds[i].gcd_ab);
}
//Cierro los archivos
if(modo_in==0){
fclose(file_in);
}
if(modo_out==0){
fclose(file_out);
}
return 0;
}