I’ve got this code finally working with a single argument on my command line, i.e. one file for it to work with, although I designed the code with the concept of it working with an unlimited number of files. What it does is take some X number of text files containing words separated by spaces, and replaces spaces with \n thus creating a list of words. Though, it successfully completes the first argument, it just ignores the 2nd.
Another minor problem seems that it also prints out some garbage letter at the end, a Y with two dots above it; I assume some EOF symbol, yet I can’t seem to stop that happening!
int main(int argc, char** argv) {
FILE *fpIn, *fpOut;
int i, j;
j = 1;
char c;
char myString[256];
printf("%d", argc);
printf("\n");
printf("The following arguments were passed to main(): ");
for(i=1; i<argc; i++) printf("%s ", argv[i]);
printf("\n");
while(argc--) {
for(i = 1; i < argc; i++) {
fpIn = fopen(argv[j], "rb");
snprintf(myString, 256, "%s~[%d]", argv[j], i);
fpOut= fopen(myString, "wb");
while (c != EOF) {
c = fgetc(fpIn);
if (isspace(c))
c = '\n';
fputc(c, fpOut );
}
j++;
}
}
return 0;
}
The
getchar(),getc()andfgetc()functions (or macros) return anint, not achar.You must use:
Think about it; the functions must be able to return any valid
charand EOF (which is distinct from any validcharvalue. So, by definition, the return value can’t be achar…What happens if you use
char?cbefore testing it (so the loop might break early).cimmediately after reading EOF (so it might print a garbage character, often ÿ, LATIN SMALL LETTER Y WITH DIAERESIS, U+00FF).chartype is unsigned, you’d never see EOF.chartype is signed, some valid characters (often ÿ again)) will be misinterpreted as EOF.The problem there is the double loop you have running:
Let us suppose you invoke the command with two file names; then
argc == 3.After the first time past the
whileloop,argc == 2. You then do aforloop withitaking the value 1; you openargv[1](becausej == 1). You process that file; then incrementjto 2, before also incrementingi, also to 2. The second time around theforloop,i== 2 as doesargc, so theforloop terminates. The while loop decrementsargcagain to 1, but tests that2 != 0. However, theforloop setsi = 1and then terminates becausei == argc. Thewhileloop decrementsargcto 1, and repeats.You can use a
whileloop or aforloop, but you don’t need both.So, either:
Or:
I’d use the
forloop.