×
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Contact US

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!

*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Students Click Here

Visual C++ 2008 express problem with run and output

Visual C++ 2008 express problem with run and output

Visual C++ 2008 express problem with run and output

(OP)
my message is in 3 sections:

1.  the C++ code is:

/* This program enciphers files using one of Vigenere, Beauford or
   Variant Beauford ciphers. Note inverses means this code also
   decrypts - eg encipherment by Vigenere can be deciphered by
   enciphering with Variant Beauford with the same key. Similarly,
   Beauford is its own inverse.

   Input via file or keyboard is of the following format:
    cipher-type
    key
    the message in free format, of any desired length
   Output will be of the form:
    theen ciphe redme ssage

   The cipher type is given by the single letter V (or v) for Vigenere,
   B (or b) for Beauford and A (or a) for Variant Beauford. Should a
   different letter be used, a message will be printed to the screen and
   Vigenere used.

   Currently the maximum allowed key is 10 characters. Excess is discarded
   with a warning message sent to the screen. MAXKEYLENGTH can be changed
   for longer or shorter limits. The key can be *any* ASCII characters, not
   just alphabetics.

   Note upper and lower case plaintext are enciphered by converting all to
   lower case first, with the output solely lower case. Non-alphabetics are
   discarded, however relatively minor adjustments could be made to allow
   longer alphabets.

   The output is given in the traditional 5 letter chunks, but BLOCKLENGTH
   can be changed to suit personal taste. Similarly, 80 character lines are
   assumed, but other lengths can be set with LINELENGTH.

   Two versions of main are given: one for input from the keyboard or from
   file redirection, the other for input from a file named on the command
   line. Just uncomment which you wish to use. Note both send output to the
   screen by default, and allow output redirection to a file (eg ... > outfile)
   If you wish to specify the output file, the modification is minor.

   An example for program verification:
    V
    orbit
    An ambassador is an Honest man sent to Lie and Intrigue abroad for
    the benefit of his Country
   produces output:
    oebuu ojtiw cijat bypvx gknig gvobm ccjmt bujvm fzhcx osswt rwpzm
    vvcmg swjbh tyjav clobk m

   Note no padding at the end to hide the message length: this is easily added.
   For instance, the final message letter can be enciphered repeatedly (still
   with progression through the key to hide the effect) until a block is full.

    Author: Dr Leisa Condie, December 1992.
    phoenix@neumann.une.edu.au
    Dept of Mathematics, Statistics and Computing Science,
    University of New England - Armidale,
    New South Wales, 2351, AUSTRALIA.
*/

#define ALPHA        26         /* length of alphabet for modulo */
#define MAXKEYLENGTH 10         /* maximum length of the key used */
#define BLOCKLENGTH   5         /* for output, how many chars in a block */
#define LINELENGTH   80         /* maximum output characters per line */

char key[MAXKEYLENGTH+1];       /* encipherment key: +1 for possible newline */
int  blockcount = 0;            /* counts of chars in printed block */
int  linechars = 0;             /* count of chars printed on current line */
int  keylength = 0;             /* holds actual length of the key */
int  vigenere=0,beauford=0,varbeau=0;
                /* cipher type is set to 1 (TRUE) if chosen */
FILE *fp;                       /* set to stdin if interactive, else file */

void getsetup(void)
{
    char ch;                /* generic character variable */
    char *tmp = key;        /* pointer to key array */

    /* find cipher type */
    ch = getc(fp);
    if (ch == 'V' || ch == 'v')          vigenere =1;
    else if (ch == 'B'|| ch == 'b')      beauford =1;
    else if (ch == 'A'|| ch == 'a')      varbeau  =1;
    else {  /* otherwise error, so notify by stderr and use Vigenere */
        fprintf(stderr,"V/B/A ciphers only - Vigenere assumed\n");
        vigenere =1;
    }

    while ((ch=getc(fp)) != '\n');      /* if extraneous input, clear it! */


    /* get key - anything after the MAXKEYLENGTH'th char is discarded */

    for (keylength=0; keylength < MAXKEYLENGTH; keylength++)
        if ((key[keylength]= getc(fp)) == '\n') break;

    if (key[keylength] != '\n'){
        while ((ch=getc(fp)) != '\n');  /* if excess key, clear it! */
        fprintf(stderr,"Key truncated to %d characters\n",keylength);
    }
}

int encipher(int i)
{
    /* Takes argument i - where we are in the key,
       Returns tmp - the ciphertext equivalent of the input if
        the input was alphabetic, else the input character unchanged */
    char ch;                /* character read in */
    int tmp;                /* for cipher char calculation */

    ch = getc(fp);
    if (ch >= 'A' && ch <= 'Z') {   /* convert to lowercase */
        ch = ch - 'A' + 'a';    /* don't trust tolower() */
    }
    if (ch >= 'a' && ch <= 'z') {   /* encipher */
        if (vigenere)
            tmp = (ch + key[i] - 2*'a') % ALPHA;
        else if (beauford)
            tmp = (key[i] - ch) % ALPHA;
        else    tmp = (ch - key[i]) % ALPHA;

        /* make offset positive and convert to lowercase char */
        while (tmp < 0) tmp += ALPHA;
        tmp += 'a';
    }
    else    tmp = ch;               /* else return character unchanged */
    return(tmp);
}

void outputcipher(void)
{
    int cipherch, i=0;              /* cipher character */

    while (!feof(fp)) {             /* keep going whilst there is input */
        cipherch = encipher(i); /* generate cipher character */
        if (cipherch < 'a' || cipherch > 'z') /* invalid char in */
            continue;       /* ignore code below - restart loop */

        /* check we haven't finished key and need to restart it */
        if (i == keylength-1)   i=0;
        else                    i++;

        /* if a BLOCKLENGTH block is finished print a space */
        if (blockcount == BLOCKLENGTH) {
            /* check whether a newline is needed yet */
            if (linechars > LINELENGTH - BLOCKLENGTH) {
                putchar('\n');
                linechars = 0;
            }
            else {
                putchar(' ');
                linechars++;
            }
            blockcount = 0;
        }
        /* print enciphered character */
        putchar(cipherch);
        blockcount++;
        linechars++;
    }
    putchar('\n');
}

/* This version of main is set for input to come from the keyboard either
   directly or through file redirection: e.g. program < input_file
*/
/*
void main(void)
{
    fp = stdin;
    getsetup();
    outputcipher();
}
*/

/* This version of main looks for an input file whose name is specified on
   the argument line: e.g. program input_file
*/
void main(int argc, char *argv[])
{
    if (argc != 2) {
        fprintf(stderr,"Usage: program <input_file>\n");
        exit(1);
    }

    if ((fp = fopen(argv[1],"r")) == NULL) {
        fprintf(stderr,"File %s cannot be read from\n",argv[1]);
        exit(1);
    }

    getsetup();
    outputcipher();
}

2.main() function is expecting command line parameters.  In order to pass command line parameters,I pass them in through visual studio, using Project Properties > Debugging > Command Parameters.
 Then run using F5 in Visual Studio, the program opens in the debugger, and without a breakpoint, the console window  closes as soon as the program finishes execution.  To keep the console window open,I ran without the debugger (Ctrl+F5), put a breakpoint at the end of main,  add some line like cin.getline() at the end of main.
This did not work it gave 8 errors.
In another run the code was not listed in the ide, just a pointer to it.this builds ok and gives a log,but there is no break to input a line and there is no output.

Pleaser help.


2.





 

RE: Visual C++ 2008 express problem with run and output

1. Use CODE tags for snippets (see Process TGML link on the form below).
2. Don't forget to open input file (in main) before reading (in getsetup).
3. Use standard int main (not void main)...
 

RE: Visual C++ 2008 express problem with run and output

(OP)
I have done this but I cant put input into prog or get output from it.

RE: Visual C++ 2008 express problem with run and output

Let's start from the beginnig:
1. Are you able to compile your source file and build your console application w/o error diagnostic messages?
2. Have you proper includes for this code?

CODE

#include <stdio.h>
#include <stdlib.h>
?

I have input/output for this code w/o any problems (VS 2008 Express)...
 

RE: Visual C++ 2008 express problem with run and output

(OP)
Hi,This is the start of my code please look at it and let me know if it is wrong.
Please refer to the whole code sent previously to see how it continues.
Your 2 replies seem to tell me that my code is wrong, but how can I correct it?
Thanks,
Freddy.

============================================================
#define ALPHA        26         /*

length of alphabet for modulo */
#define MAXKEYLENGTH 10         /*

maximum length of the key used */
#define BLOCKLENGTH   5         /* for

output, how many chars in a block */
#define LINELENGTH   80         /*

maximum output characters per line */

char key[MAXKEYLENGTH+1];       /*

encipherment key: +1 for possible

newline */
int  blockcount = 0;            /*

counts of chars in printed block */
int  linechars = 0;             /*

count of chars printed on current line

*/
int  keylength = 0;             /*

holds actual length of the key */
int  vigenere=0,beauford=0,varbeau=0;
                /*

cipher type is set to 1 (TRUE) if

chosen */
FILE *fp;                       /* set

to stdin if interactive, else file */

void getsetup(void)
{
    char ch;                /*

generic character variable */
    char *tmp = key;        /*

pointer to key array */

    /* find cipher type */
    ch = getc(fp);
    if (ch == 'V' || ch == 'v')     

     vigenere =1;
===========================================================

etc.

RE: Visual C++ 2008 express problem with run and output

See answer #1 in my previous post. Where is the question?

See advice #2 in my previous post. Add these includes in the code.

Again and again: I have built the solution from the initial post code (Visual Studio 2008 Express, build solution from the existing code). It works.
 

RE: Visual C++ 2008 express problem with run and output

(OP)
I will try and ans. your q's:
==========================================================
Ur reply 1:
"open input file (in main) before reading (in getsetup)"

my code has:
"void getsetup(void)" at about line 11 of the 2nd code snippet I sent.

Should I put "int main ()" in the line above it to open the input file?

So we have:
int main ()
void getsetup(void)       ?
==========================================================
2. U:
"compile your source file and build your console application w/o error diagnostic messages?"

ME:
The folder I use is:
" my computer"/programs/ vis studio/vc/vc wizards" this has a compiler and this builds codes as a console ok with a pre-defined header and a pointer to the location of the codes in my docs,
 but when i run debug it is ok BUT there is no input or output.
There are NO ERRORS at this stage.

Pressing F5 is supposed to run the prog and get input and output, but it just repeats the process.

It may be that the prog is supposed to run from another folder but I dont know which one.
There are 37 folders and 39 "clickers"!

What is "Common 7" for?

The debug run gives:
'vig7.exe': Loaded 'C:\Documents and Settings\Brian Southey\My Documents\Maths and computing\Cryptography\Vigenere\vig7\vig7\Debug\vig7.exe', Symbols loaded.
'vig7.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll'
'vig7.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll'
'vig7.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll'
The program '[2200] vig7.exe: Native' has exited with code 0 (0x0).
But where are these files?
Can they be run from one of these files?

==========================================================
3. U: "Have you proper includes for this code?
#include <stdio.h>
#include <stdlib.h>"

Me: No.

The code starts with "#define ALPHA"........
Then "char key..."
     "int blockcount = 0"......
     "FILE *fp;     /* set to stdin......
     "void getsetup(void)"......

Where would i put the std includes?

========================================================
3. As I said the actual code does not appear on the platform.
If I paste the full code onto the platform with or without the pre-defined header and build it I get many errors.
===========================================================
Please help,
Freddy.




 

RE: Visual C++ 2008 express problem with run and output

What's a knotty question...
Suppose we have a source file with contents from your original post. Let its name is vig.c (it is C language source;). Make a new directory and place this file in this directory. Now start VS 2008...

Select File|New|Procect From Existing Code. Say to VS Wizard this directory name, select Win32 Console Application. Now you have a project with vig.c as a source file.

Add two includes (see my posts above) at the start of the source. Try to build solution w/o errors (may be with warnings). Now you have vig.exe (in debug mode by default).

You must define command line argument with processed file name (path). Open Project|Properties window, select Debug page and type the path in Command Argument field. Now you may start the application (for example, via F5 or better Ctrl-F5) and enjoy its output in console output window...

Sorry, I do not understand what's your pro level in VS 2008 and C language. If you want to run this program you must define input file name as the 1st (one and only one;) atgument then the program prints its output via stdout in console window...

Apropos, this subforum (Win API) is dedicated to pecularities of Windows API functions calls, not to standard Visual Studio operations with ordinary C files...
 

Red Flag This Post

Please let us know here why this post is inappropriate. Reasons such as off-topic, duplicates, flames, illegal, vulgar, or students posting their homework.

Red Flag Submitted

Thank you for helping keep Tek-Tips Forums free from inappropriate posts.
The Tek-Tips staff will check this out and take appropriate action.

Reply To This Thread

Posting in the Tek-Tips forums is a member-only feature.

Click Here to join Tek-Tips and talk with other members! Already a Member? Login

Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close