编辑文件处理Visual C ++

时间:2013-10-12 07:17:30

标签: c file-io

所以我遇到了使用visual C ++编辑文件处理的问题。我现在的代码将显示文件中的内容,编辑时,你必须重新键入文件的所有包含,包括你编辑的文件。但是我的教授说这不是编辑而是覆盖原始文件。所以我想知道如何在不重写整个语句的情况下编辑文件的包含。

   void edit()
    {
        char choice;
        char newdata[1000];
        char previousdata[1000];
        char filename [1000];
        int count =0;
        printf("Example: D:/sample.txt");
        printf("Enter filename:");
        scanf("%s",&filename);
        fp=fopen(filename,"r");

        if(fp==NULL)
        {
            printf("Unable to open....\n");
        }
        else
        {
            printf("Success in opening file...\n\n");
            int c;

            c = getc(fp);
            while(c!=EOF)
            {
                printf("%c",c);
                previousdata[count] = c;
                c = getc(fp);
                count++;
            }

        }
        fclose(fp);

        printf("\nPlease Type the new statement");
        printf("\nInput Statement:\n");
        scanf("%s",&newdata);


        printf("\nDo you want to save the changes?");
        printf("\n Press[Y] YES \t\t Press[N] NO");
        printf("\n Your choice:");
        scanf("%s",&choice);

        if(choice == 'Y'|| choice == 'y')
        {
            fp =fopen(filename,"w");
            fprintf(fp,"%s",newdata);
            fclose(fp);
            main();
        }
        else if(choice == 'N'||choice == 'n')
        {
            system("CLS");
            main();
        }       

    }

2 个答案:

答案 0 :(得分:1)

如果您想要一个真正的文件版本,您可能希望将所有文件内容保留在内存中。这对于中小型文件(即最近笔记本电脑上少于1或2千兆字节的文件)是合理的。

您可能希望保留一系列行指针。数组本身以及指向其中一行的每个指针都将被堆分配。

您可以拥有数组,使用的长度和分配的大小:

char** linarr; // heap-allocated array of lines
unsigned nblines; // used length, i.e. number of lines
unsigned size;  // allocated size of linarr;

在初始化时,您预先分配它,例如与

#define INITIAL_SIZE 100
linarr = calloc (INITIAL_SIZE, sizeof(char*));
if (!linarr)  { perror("calloc"); exit(EXIT_FAILURE); };
size = INITIAL_SIZE;
nblines = 0;

然后你需要一个循环来读取每一行,在需要时增长数组

FILE* inputf = fopen(filename, "rt");
// code from https://stackoverflow.com/a/19331746/841108
if (!inputf) { perror("fopen"); exit(EXIT_FAILURE); };
while (!feof (inputf)) {
   // grow the array when full
   if (nblines >= size) { 
       unsigned newsize = 5*size/4 + 10;
       char**newarr = calloc(newsize, sizeof(char*));
       if (!newarr) { perror("calloc newarr"); exit (EXIT_FAILURE); };
       for (unsigned ix=0; ix<nblines; ix++) 
         newarr[ix] = linarr[ix];
       free (linarr);
       linarr = newarr;
       size = newsize;
   };
   char* curline = NULL;
   size_t curlinesize = 0;
   if (getline(&curline, &curlinesize, inputf)<0)
      { perror("getline"); exit (EXIT_FAILURE); };
   linarr[nblines] = curline;
   nblines++;
};
fclose (inputf); 
inputf = NULL;

最后,您需要适当地插入行(在不断增长的linarr内,更新nblines等...)并写入新文件(或其新内容)。我把它留给你。

BTW,如果你用C ++编写(不是用C语言编写),你可以使用std::vector<std::string>

如果您只想附加到现有文件,而不是编辑它(即在中间更改它),您可以按Arpit评论,只需使用附加模式"a+"即可fopen。但是你的问题提到编辑(不附加)文件,这通常要求将所有文件内容放在内存中,并以适当的数据结构进行组织。

PS:我对Windows一无所知,我试图对标准进行编码,特别是Posix和C99

答案 1 :(得分:1)

从您的程序代码看起来您​​正在附加文本而不是编辑。因此,如果您可以在附加模式(a+)中打开文件,那将很容易。

要使您的程序正常工作,您需要先将旧数据附加到旧数据中,然后再将其写入文件中。

printf("\nPlease Type the new statement");
    int c;            
    printf("\nInput Statement:\n");
    c=getch();
    while(c != '`'){  //use ` to quit writing.
        count++;    
        olddata[count]=c; //extending the olddata array with new data.
        }
    printf("\nDo you want to save the changes?");
    printf("\n Press[Y] YES \t\t Press[N] NO");
    printf("\n Your choice:");
    scanf("%s",&choice);
    if(choice == 'Y'|| choice == 'y')
    {
        fp =fopen(filename,"w");
        fprintf(fp,"%s",olddata);
        fclose(fp);
        main(); //this is not good. use return instead.
    }

如果要避免在阵列中备份当前文件数据,则需要以a+模式打开文件。

注意:这不是编辑程序,而是用于在末尾附加文本。如果你想要真正的编辑,那么看看@Basile答案。

另一个例子

int main()
{
    FILE* f=fopen("main.c","a+");
    int c;
    c=getc(f);
    while(c!=EOF){
        putchar(c);
        c=getc(f);
    }
    prinf("\n Start entering your new content \n");
    c=getchar();
    while (c != '`'){
        fputc(c,f);
        c=getchar();
    }
    fclose(f);
    return 0;
}