0

I am working on a assignment:

Open a text file and print its contents in command window, ask the user to replace the text from the text file to be written and save the text file.

When I set the maximum character size to 256,it works but when I give 20 it doesn't. Is there a way to overcome this problem by printing the characters beyond the defined limit?

I have used fgets() function.

#include <stdio.h>
#include <string.h>
#define MAX 20
 int main(){
    FILE *fptr1, *fptr2;
    int lno, linectr = 1;
    char str[MAX],fname[MAX];
    char newln[MAX], temp[] = "temp.txt";

    printf("\n\n Replace a specific line in a text file with a new text :\n");
    printf(" Input the file name to be opened : ");

    fgets(fname, MAX, stdin);
    fname[strlen(fname) - 1] = '\0';
    fptr1 = fopen(fname, "r");
    if (!fptr1)
    {
            printf("Unable to open the input file!!\n");
            return 0;
    }
    fptr2 = fopen(temp, "w");

    if (!fptr2)
    {
            printf("Unable to open a temporary file to write!!\n");
            fclose(fptr1);
            return 0;
    }

    printf(" Input the content of the new line : ");
    fgets(newln, MAX, stdin);
    fgets(str, MAX, stdin);
    printf(" Input the line no you want to replace : ");
    scanf("%d", &lno);
    lno++;

    while (!feof(fptr1))
    {
        strcpy(str, "\0");
        fgets(str, MAX, fptr1);

        if (!feof(fptr1))
        {
            linectr++;
            if (linectr != lno)
                {
                    fprintf(fptr2, "%s", str);
                }
                else
                {
                    fprintf(fptr2, "%s", newln);
                }
            }
    }
    fclose(fptr1);
    fclose(fptr2);
    remove(fname);
    rename(temp, fname);
    printf(" Replacement did successfully\n");
    return 0;
}
SKR
  • 1
  • 2
  • 2
    Possibly unrelated: see [Why is “`while ( !feof (file) )`” always wrong?](https://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) – pmg Jul 16 '21 at 06:44
  • Please [edit] and show a minimal file, an input, the expected output and the actual output. A [mcve] should include all this. – Jabberwocky Jul 16 '21 at 06:51

1 Answers1

0

I'm assuming you are asking how to read a 100 char long line into a 20 char sized buffer.

Well, obviously the whole line does not fit into the buffer. You need to read in chunks. You know you've read the last chunk when the buffer contains a newline (or EOF is reached)...

if (!fgets(str, MAX, fptr1)) /* EOF detected */;
//let's see if we got a partial line
size_t len = strlen(str); // note: len != 0 for text files
if (str[len - 1] == '\n') {
    // full line
    // do the comparison or whatever
} else {
    // fgets got first chunk
    // read rest of line and ignore it
    for (;;) {
        int ch = fgetc(fptr1);
        if (ch == EOF) /* EOF detected */;
        if (ch == '\n') break; // full line read, ready for next one
    }
}
pmg
  • 106,608
  • 13
  • 126
  • 198