C语言关于写txt文件问题

img


我想用over来覆盖已经写好的154行,用什么C语言函数 怎么做??

文本文件不能像二进制文件那样覆盖,只能是全文搜索,找到over位置,用fseek定位文件指针,然后fwrite写入,写入的内容长度必须和原来的一样。

找到要覆盖的行数,然后写入覆盖内容就可以了

【以下回答由 GPT 生成】

问题场景: 我有一个名为example.txt的文本文件,我需要在其中覆盖第154行的内容。

尝试过的方法: 我已经尝试使用fopen函数打开文件,但不知道如何定位到第154行并覆盖该行的内容。

解决方案: 1. 打开文件: 使用fopen函数打开example.txt文件,并将文件指针返回给一个变量。

FILE *file = fopen("example.txt", "r+");
if (file == NULL) {
    // 如果打开文件失败,可以进行错误处理
}
  1. 定位到第154行: 使用循环遍历行数,直到达到第154行。在循环中使用fgets函数读取每一行,然后判断是否达到第154行。
int line_number = 0;
char buffer[256]; // 假设一行最多256个字符

while (fgets(buffer, sizeof(buffer), file)) {
    line_number++;

    // 如果达到第154行,跳出循环
    if (line_number == 154) {
        break;
    }
}
  1. 覆盖该行的内容: 使用fseek函数将文件指针移动到第154行的开头位置,并使用fwrite函数将新的内容写入该行。
fseek(file, -strlen(buffer), SEEK_CUR); // 将文件指针移动到第154行开头
char new_content[] = "This is the new content"; // 新的内容
fwrite(new_content, sizeof(char), strlen(new_content), file); // 写入新的内容
  1. 关闭文件: 使用fclose函数关闭文件。
fclose(file);

完整的代码如下:

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

int main() {
    FILE *file = fopen("example.txt", "r+");
    if (file == NULL) {
        // 如果打开文件失败,可以进行错误处理
    }

    int line_number = 0;
    char buffer[256]; // 假设一行最多256个字符

    while (fgets(buffer, sizeof(buffer), file)) {
        line_number++;

        // 如果达到第154行,跳出循环
        if (line_number == 154) {
            break;
        }
    }

    fseek(file, -strlen(buffer), SEEK_CUR); // 将文件指针移动到第154行开头
    char new_content[] = "This is the new content"; // 新的内容
    fwrite(new_content, sizeof(char), strlen(new_content), file); // 写入新的内容

    fclose(file);

    return 0;
}

请注意,这段代码假设一行最多256个字符,请根据实际情况调整buffer的大小。另外,这段代码没有考虑一些异常情况,比如文件行数不足154行等,请根据实际需求进行错误处理。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

//问题不是一般的多
/* 写入文件制定行的字符串 */
BOOL WriteFileOneLineA(char* FilePath, int Line, //从1开始
    char* Buffer, int BufferLength)
{
    int NowLine = 1;
    FILE* ReadFilePoint = fopen(FilePath, "rb");
    __int64 FileStrLength = GetFileSizeHA(FilePath) + 1;
    char* FileStr = new char[FileStrLength];
    
    char* SoureFileStr = FileStr;
    ZeroMemory(FileStr, FileStrLength);

    if (ReadFilePoint == NULL)
    {
        return FALSE;
    }

    fread(FileStr, sizeof(char), FileStrLength, ReadFilePoint);

    fclose(ReadFilePoint);

    while (1)
    {
        if (*FileStr == '\0')
        {
            break;
        }

        if (*FileStr == '\n')
        {
            NowLine++;
            if (NowLine == Line)
            {
                char* FileLineFrontStr = NULL;
                char* FileLineBehindStr = NULL;
                char* ChangeLaterStr = NULL;

                FileLineFrontStr = (char*)new char[FileStr - SoureFileStr + 10];
                ZeroMemory(FileLineFrontStr, FileStr - SoureFileStr + 10);

                *FileStr = '\0';
                strcpy(FileLineFrontStr, SoureFileStr);

                AddChAtLeastStrA(FileLineFrontStr, '\n');

                FileStr++;

                while (1)
                {
                    if (*FileStr == '\n')
                    {
                        FileStr++;
                        break;
                    }
                    FileStr++;
                }

                FileLineBehindStr = (char*)new char[strlen(FileStr) + 1];
                ZeroMemory(FileLineBehindStr, strlen(FileStr) + 1);
                strcpy(FileLineBehindStr, FileStr);

                int ChangeLaterStrLength = strlen(FileLineFrontStr) + strlen(Buffer) + strlen(FileLineBehindStr) + 1;
                ChangeLaterStr = (char*)new char[ChangeLaterStrLength];
                ZeroMemory(ChangeLaterStr, ChangeLaterStrLength);
                sprintf(ChangeLaterStr, "%s%s%s", FileLineFrontStr, Buffer, FileLineBehindStr);

                FILE* WriteFilePoint = fopen(FilePath, "wb");

                if (WriteFilePoint == NULL)
                {
                    delete(FileStr);
                    delete(FileLineFrontStr);
                    delete(FileLineBehindStr);
                    delete(ChangeLaterStr);

                    return FALSE;
                }

                fwrite(ChangeLaterStr, sizeof(char), ChangeLaterStrLength, WriteFilePoint);

                fclose(WriteFilePoint);

                delete(SoureFileStr);
                delete(FileLineFrontStr);
                delete(FileLineBehindStr);
                delete(ChangeLaterStr);

                return TRUE;
            }
        }

        FileStr++;
    }

    delete(SoureFileStr);

    return FALSE;
}