覆盖文本文件的一部分

Override part of text file

文本文件:

line_1: abcdefg

将前 k 个字符覆盖为 ttttt,以便新文本文件为:

line_1: tttttfg

我使用了 fprintf 并且在打开 .txt 文件时我使用了 w+ 标志,但是它会擦除整个 .txt 文件而不仅仅是覆盖第一个 bytes_number 个字符。

我尝试了很多似乎都不成功的东西。任何提示将不胜感激! 提前致谢!

void my_write (char* path, int bytes_number, char* flag, char* data, int sockfd)
{
    FILE* fp;
    char* test;
    int n, i;
    char buffer[BUFFER_SIZE];
    if (bytes_number > 1000 || bytes_number < 0)
    {
        write (sockfd, "Failure", strlen("Failure"));
        return;
    }
    test = data;
    if (strlen(test) < bytes_number)
    {
        write (sockfd, "Failure", strlen("Failure"));
        return;
    }
    if (!strcmp(flag, "override"))
    {
        fp = fopen(path, "w+"); /* Open file with flag 'w' so that we overrun the data */
        if (fp == NULL) { /* File doesn't exist, invalid path*/
            write (sockfd, "Failure", strlen("Failure"));
            return;
        }
        **i = fprintf (fp, "%.*s\n", bytes_number, data);**
        if (i < 0)
            write (sockfd, "Failure", strlen("Failure"));
        else
            write (sockfd, "Write Success", strlen("Write Success"));
    }
    else if (!strcmp(flag, "append"))
    {
        fp = fopen(path, "ab"); /* Open file with flag 'ab' so that we don't override data while writing */
        if (fp == NULL) /* File doesn't exist, invalid path*/
            write (sockfd, "Failure", strlen("Failure"));
            i = fprintf (fp, "%.*s\n", bytes_number, data);
        if (i < 0)
            write (sockfd, "Failure", strlen("Failure"));
        else
            write (sockfd, "Write Success", strlen("Write Success"));
    }
    else {
        write (sockfd, "Failure", strlen("Failure"));
    }
    fclose(fp);
}

fopen(path,"w+") 打开一个文件进行写入和更新,如果文件已经存在则先删除该文件。为了避免先删除文件,可以使用fopen(path,"r+")打开它进行阅读和更新。

如果目的只是替换指定的字符,则应省略 fprintf 格式字符串末尾的 \n,以便该行显示为 i = fprintf (fp, "%.*s", bytes_number, data)