Resulta que estaba en minecraft y me encontré un cubito (?, resulta que el error de mi programa es el siguiente, yo pongo el archivo que deseo y no sale, probe con if, con while y da el mismo resultado pero no interpreta la primera linea. Tengan en cuenta que es mi primer programa. Lo mas extraño es que antes de unas modificaciones funcionaba de 10. Parece que esta peor que los glitchs del GTA V.
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <ctime>
//#include <windows.h> Por si se quiere un sleep
using namespace std;
FILE *archivo;
FILE *ccmd;
char *pos;
char lineas[150];
// DICCIONARIO DE PROCEDIMIENTOS, PARA SIMPLIFICAR:
/*
void fscls(){
fprintf(ccmd,"\tcout << string(50, '\\n');\n");
}
void fsfin(){
fprintf(ccmd,"\texit (0) ;\n");
}
void fspaus(){
fprintf(ccmd,"\tgetchar();\n");
}
void fsAboWhi(){
lineas[0] = '\0';
} */
void ArchCheq( FILE *fili,int n){
if (fili == NULL){
cout << "Error de archivo ("<< n << ")" << endl;
exit(1);
}
}
int main( int argc, char **argv) {
clock_t inicio,fin;
inicio=clock();
// Fix para que el programa no falle si no tiene comandos
if ( argc < 3 ) {
cout<<"Ejemplo: programa \"Archivo a Abrir.cmd\" -c \"ArchivoSaliente.c\" "<<endl;
return 1;
}
if ( !strcmp( argv[2], "-c" ) ) {
archivo = fopen(argv[1],"r");
ccmd = fopen(argv[3],"wt");
}else{
cout << "Ejemplo: programa \"Archivo a Abrir.cmd\" -c \"ArchivoSaliente.c\" "<< endl;
}
//Verificacion
ArchCheq(archivo,1);
ArchCheq(ccmd,2);
while (!feof(archivo))
{
fgets( lineas, 150, archivo ); //LEE EL ARCHIVO LINEA POR LINEA.
if ((pos=strchr(lineas, '\n')) != NULL) *pos = '\0'; //AGREGA CARACTER NULO
// INTERPRETADOR:
// PAUSAS
if (!strcmp(lineas,"PAUSE>NUL")){
fprintf(ccmd,"\tgetchar();\n");
lineas[0] = '\0';
}
if (!strcmp(lineas,"PAUSA>NUL")){
fprintf(ccmd,"\tgetchar();\n");
lineas[0] = '\0';
}
if (!strcmp(lineas,"PAUSE")){
fprintf(ccmd,"\tcout << \"Presione una tecla para continuar.\" << endl;\n");
fprintf(ccmd,"\tgetchar();\n");
lineas[0] = '\0';
}
if (!strcmp(lineas,"PAUSA")){
fprintf(ccmd,"\tcout << \"Presione una tecla para continuar.\" << endl;\n");
fprintf(ccmd,"\tgetchar();\n");
lineas[0] = '\0';
}
// EXIT, FALTA PARA ESPECIFICAR.
if (!strcmp(lineas,"EXIT")){
fprintf(ccmd,"\texit (0) ;\n");
lineas[0] = '\0';
}
if (!strcmp(lineas,"SALIR")){
fprintf(ccmd,"\texit (0) ;\n");
lineas[0] = '\0';
}
// SECTOR PARA LIMPIAR PANTALLA
if (!strcmp(lineas,"CLS")){
fprintf(ccmd,"\tcout << string(50, '\\n');\n");
lineas[0] = '\0';
}
if (!strcmp(lineas,"CLEAR")){
fprintf(ccmd,"\tcout << string(50, '\\n');\n");
lineas[0] = '\0';
}
if (!strcmp(lineas,"LIMPIAR")){
fprintf(ccmd,"\tcout << string(50, '\\n');\n");
lineas[0] = '\0';
}
// Sistema complejo
//ECHO
if (strncmp (lineas,"ECHO",1) == 0) // Si se verifica la existencia procede a procesar la linea
{
char ECHO[] = "ECHO ";
int posicion = strlen( lineas ) - strlen( strstr( lineas, ECHO ) );
/* // copiar la primera linea (no es necesario en este caso)
for( int a = 0; a < posicion; a++ )
lineas[ a ] = lineas[ a ];
*/
//copia la segunda linea
for( int a = posicion; a < strlen( lineas ); a++ )
lineas[ a ] = lineas[ a+5 ]; // 5 es el tamaño del ECHO
fprintf(ccmd,"\tcout << \"%s\" << endl;\n",lineas);
lineas[0] = '\0';
}
if (!strcmp(lineas,"\0"))
{
}else{
fprintf(ccmd,"\t%s\n",lineas); // SI NO COINCIDE CON NINGUNO LO IMPRIME EN C/C++ (MUY BETA).
}
// Sleep(100); requiere windows.h
}
fclose(archivo);
fclose(ccmd);
cout << "\x5C\x5C Interpetracion finalizada \x5C\x5C" << endl;
fin=clock();
printf("Tiempo transcurrido: %f segundos\n", (fin-inicio)/(double)CLOCKS_PER_SEC);
}