文本文件不能像二进制文件那样覆盖,只能是全文搜索,找到over位置,用fseek定位文件指针,然后fwrite写入,写入的内容长度必须和原来的一样。
找到要覆盖的行数,然后写入覆盖内容就可以了
【以下回答由 GPT 生成】
问题场景: 我有一个名为example.txt的文本文件,我需要在其中覆盖第154行的内容。
尝试过的方法: 我已经尝试使用fopen函数打开文件,但不知道如何定位到第154行并覆盖该行的内容。
解决方案: 1. 打开文件: 使用fopen函数打开example.txt文件,并将文件指针返回给一个变量。
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);
完整的代码如下:
#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;
}