How do I write to a specific line of file in c?

2019-09-01 02:58发布

So I have a project I am doing and I have created a program that allows the user to write to a file, as shown below:

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

 FILE *fd;
 FILE *fw;

     struct store
     {
          char Word[512];
          char NWord[512];
     }
     stock;

     struct store2
     {
          char Definition[512];
     }
     stock2;

char done='y';
int count=1;
int c=0;
int d=0;

int main(void)
{
    fw=fopen("Test Z W.txt","w");
    fd=fopen("Test Z D.txt","w");

    do
    {    
         printf("Word %d: ",count);
         gets(stock.Word);
         while((c= getchar()) != '\n' && c != EOF);

         printf("Definition %d: ",count);
         gets(stock2.Definition);
         while((c= getchar()) != '\n' && c != EOF);  

         fprintf(fw,"%s\n", stock.Word);         
         fprintf(fd,"%s\n", stock2.Definition);        
         count=count+1;  
         system("cls");                
    }
    while (count<11);

fclose(fd);
fclose(fw);

return 0;

}

this code is fine, however, I would like to expand it so that there is an option to edit just one chosen line, rather than wiping the entire file and writing all of the contents again.

All I have to work on is using How do you write to a specific line of a txt file in C?

Which wasn't very helpful since I couldn't take an answer and import it to my code, either way all I need is something where an error such as the one below, can be fixed easily.

 1
 2
 Three
 4
 5
 6
 7
 8
 9
 10

Where the user will automatically be asked which line they want to edit.

1条回答
地球回转人心会变
2楼-- · 2019-09-01 03:20
#include <stdio.h>
int main()
{
    FILE *fp,*fc;
    int lineNum;  //stores line number which should be edited.
    int count=0;  //count number lines in source file.
    int ch;   //temporary place to store character of source file(one at a time).
    int edited=0;  //0=false and 1=true
    int t;   //temporary place to store input which you want to be replaced with error in text file.


    fp=fopen("source.txt","r");
    fc=fopen("target.txt","w");

    if(fp==NULL||fc==NULL)
    {
        printf("\nError...cannot open/create files");
        return 1;
    }

    printf("\nEnter Line Number Which You Want 2 edit: ");
    scanf("%d",&lineNum);

    while((ch=fgetc(fp))!=EOF)
    {
        if(ch=='\n')  //counts number of lines
            count++;
        if(count==lineNum-1 && edited==0)  //if specific line(error line) is found and that line is still not edited. More Explanation:- If we want to edit 3rd line than we should start writing at the end of 2nd line(hence count==lineNum-1) and edited==0 means that error line is still not edited. 
        {
            printf("\nEnter input to store at line %d:",lineNum);

            scanf(" %c",&t);  //You can replace this statement with any input operation which you want to replace it with the error line.

            if(count==0)  //if its the first line to edit..
                fprintf(fc,"%s\n",t)   //watch closely,no '\n' before %s,This will copy without creating a extra newline in beginning of new file.
            else 
                fprintf(fc,"\n%s\n",t);  //stores input at error line in file fc(target.txt) from variable t.

            edited=1;  //this prevents loop to execute more than once(as error is already edited),so there will be no need to execute this loop till the end of program

            while( (ch=fgetc(fp))!=EOF )  //Actually this loop will skips the existing line in source.txt(see below)
            {                           //we want to skip this line because this is error line.
                if(ch=='\n')//this will break when next new line(after error line is skipped) is found.
                    break;
            }
       }
       else
          fprintf(fc,"%c",ch);
    }
    fclose(fp);
    fclose(fc);

    if(edited==1)
        printf("\nCongrates...Error Edited Successfully.");
    else
        printf("\nLine Not Found");

return 0;
}

This program will open a source file (which may have error,i called it source.txt*) and keeps reading it character by character and write to new file (target.txt) untill (EOF) is found.But it will stop at the specific line and will ask user to input some data which will be written in place of error(error line from source file) in new text file( target.txt).

so at the end you will get target.txt file free from errors. Open and check it.

In this program i have assumed that we want to replace only single character at line 3.but you can change this operation to replace it with string,float or integers etc.

Here is the output:-

Enter Line Number Which You Want 2 edit: 3

Enter input to store at line 3: 3

Congrates...Errors Edited Successfully.

contents of target.txt:-

1

2

3

4

5

6

7

查看更多
登录 后发表回答