简体   繁体   中英

debug with no errors or warnings

The following code compiles with no error or warnings, I can also execute the program and it will act as expected in that it will return the error messages at locations it is expected, for example, providing arguments to non-existent files. This lets me know the code is working as far as line 28 (close of the !fpc section)

Meaning there must be an issue from the

register int ch, i; 

Down to

return (1);

before

printf("\"%s\"\n",line);\

The program is expected to take command line arguments of the program name itself and two file names, it then opens both of these files, and should then copy strings from the first file up to a max length to the second file while adding " to both the start and end of the string in the new file.

The code I have is

fgetline.c

#include "fgetline.h"

int main(int argc, char *argv[]) {

    if (argc != 3) {
        printf("usage: enquote filetocopy filetowrite \n");
        exit(1);
    }

    fp = fopen(argv[1], "r");
    if (!fp) {
        printf("Couldn't open copy file: (%d) %s\n", errno, strerror(errno));
        return -1;
    }

    fpc = fopen(argv[2], "r+");
    if (!fpc) {
        printf("Couldn't open write file: (%d) %s\n", errno, strerror(errno));
        return -1;
    }

    register int ch, i;

    ch = getc(fp);
    if (ch == EOF)
        return -1;

    i = 0;
    while (ch != '\n' && ch != EOF && i < max) {
        line[i++] = ch;
        ch = getc(fp);
    }
    line[i] = '\0';

    while (ch != '\n' && ch != EOF) {
        ch = getc(fp);
        i++;
    }
    return(i);

    printf("\"%s\"\n",line);

    fclose(fp);
    fclose(fpc);
    return 0;
}

fgetline.h

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int fgetline(FILE *fp, char *line, int max);
FILE *fp, *fpc;
#define max 30
char line[max + 1];

I am compiling with

debian:~/uni/Ass0$ gcc fgetline.c -Wall -o enquote
debian:~/uni/Ass0$ cd /

testing I did was

debian:~/uni/Ass0$ ./enquote
usage: enquote filetocopy filetowrite
debian:~/uni/Ass0$ ./enquote test
usage: enquote filetocopy filetowrite
debian:~/uni/Ass0$ ./enquote test frog
Couldn't open write file: (2) No such file or directory
debian:~/uni/Ass0$ ./enquote monkey frog
Couldn't open copy file: (2) No such file or directory
debian:~/uni/Ass0$ cat test
ting
test
123

tim@debian:~/uni/Ass0$ cat test2
tim@debian:~/uni/Ass0$ ./enquote test test2
tim@debian:~/uni/Ass0$ cat test2

expected result would be when I run ./enquote test test2, would copy

ting
test
123

from test to test2 so it would appear like

"ting"
"test"
"123"

Thanks, not sure how much more info to give.

There are many issues with your code, compiling with all warnings enabled would have spotted some of them:

  • Declaring global variables in a header file is good practice, but not defining them there. The extern keyword is used for declarations. The definitions belong in the C file. In this case, variables such as fp , fp1 , line should be defined as local variables, not global variables.
  • Output file argv[2] should be open with "w" mode, "r+" is used for updated mode and will fail if the file does not exist. Update mode is very tricky and confusing, avoid using it.
  • Do not use the register keyword, it is obsolete now as compilers are smart enough to determine how to best use registers.
  • Your while loops will read just 2 lines from the input file, storing the first into the line array and discarding the second one.
  • The return (i); statement exits the program, no output is performed, the remaining statements in the function are ignored completely (-Wall might have spotted this error).

You can simplify the problem by considering this: You want to output a " at the beginning of each line and before the '\\n' at the end of each line. You do not need to buffer the line in memory, which would impose a limit on line length. Just output the " whenever you start a line and before you end one:

#include <errno.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    FILE *fp, *fpc;
    int ch, last;

    if (argc != 3) {
        printf("usage: enquote filetocopy filetowrite\n");
        exit(1);
    }

    fp = fopen(argv[1], "r");
    if (!fp) {
       fprintf(stderr, "Could not open input file: (%d) %s\n",
               errno, strerror(errno));
        return 2;
    }

    fpc = fopen(argv[2], "w");
    if (!fpc) {
       fprintf(stderr, "Could not open output file: (%d) %s\n",
               errno, strerror(errno));
        return 2;
    }

    last = '\n';  // we are at the beginning of a line
    while ((ch = fgetc(fp)) != EOF) {
        if (last == '\n') {
            fputc('"', fpc);  // " at the beginning of a line
        }
        if (ch == '\n') {
            fputc('"', fpc);  // " at the end of a line
        }
        fputc(ch, fpc);
        last = ch;
    }
    if (last != '\n') {
        // special case: file does not end with a \n
        fputc('"', fpc);  // " at the end of a line
        fputc('\n', fpc);  // put a \n at the end of the output file
    }

    fclose(fp);
    fclose(fpc);
    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM