C++ fstream替换文件的一部分
当我这样做的时候C++ fstream替换文件的一部分,c++,io,fstream,C++,Io,Fstream,当我这样做的时候 fstream someFile("something.dat", ios::binary|ios::out); someFile.seekp(someLocation, ios::beg); someFile.write(someData, 100); 它似乎将整个文件替换为这100个字节,而不是仅替换相应的100个字节,就像我指定了ios::trunc一样。有没有一种可移植的方法不让它截断文件 编辑:添加ios::in似乎可以做到这一点,为什么需要这样做,这是标准行为吗
fstream someFile("something.dat", ios::binary|ios::out);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);
它似乎将整个文件替换为这100个字节,而不是仅替换相应的100个字节,就像我指定了ios::trunc一样。有没有一种可移植的方法不让它截断文件
编辑:添加ios::in似乎可以做到这一点,为什么需要这样做,这是标准行为吗
编辑#2:我没有尝试附加到现有文件。我需要替换100个字节,而其余字节不受影响。AFAIR ios::out仅指定文件用于输出,而ios:binary仅指定文件为二进制。流的默认行为是创建新文件并覆盖旧文件。如果要修改现有文件,必须使用ios::app标志打开该文件
ATM我无法检查我的引用,因此请务必仔细检查,但我认为这是准确的。AFAIR ios::out仅指定文件用于输出,ios:binary仅指定文件为二进制。流的默认行为是创建新文件并覆盖旧文件。如果要修改现有文件,必须使用ios::app标志打开该文件
ATM我无法检查我的引用,所以一定要仔细检查,但我认为这是准确的。ios:in掩码告诉文件指针指向文件开头的位置,以便它可以从一开始就开始读取。但是,您可能希望使用fseek将文件指针设置在文件的开头。ios:in掩码将文件指针告知文件开头的位置,以便它可以从一开始就开始读取。但是,您可能希望使用fseek在文件开头设置文件指针。如果要在文件末尾写入,则需要附加标志ios::app
在文件的中间任意地做它,你需要寻找正确的地方。您可以通过打开文件进行输入和输出,但如果我是您,我会创建一个临时文件,将输入复制到mark,写入新数据,将其余数据复制到EOF,关闭文件并用临时文件替换以前的版本。这称为“主文件更新”。如果要在文件末尾写入,则需要附加标志ios::app
在文件的中间任意地做它,你需要寻找正确的地方。您可以通过打开文件进行输入和输出,但如果我是您,我会创建一个临时文件,将输入复制到mark,写入新数据,将其余数据复制到EOF,关闭文件并用临时文件替换以前的版本。这称为“主文件更新”。因为文件已经存在,请以“读+写”模式打开它,然后执行seekp。我想它会起作用的
fstream someFile("something.dat", ios::binary|ios::out|ios::in);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);
由于文件已经存在,请以“读+写”模式打开它,然后执行seekp。我想它会起作用的
fstream someFile("something.dat", ios::binary|ios::out|ios::in);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);
输入和输出是非标准的,还是您只是建议使用这种数据安全的替代方法?输入和输出是标准的,只是很难获得正确的代码。使用面向记录或固定格式的数据会更容易一些,但使用类似C语言的默认IO方式是基于可变长度文本的记录,或纯二进制。因此,如果大小或偏移量错误,或者有多个写入程序,可以对整个文件进行mung。如果你做一个主文件更新,你至少应该得到一个内部一致的文件。输入和输出是非标准的,还是你只是建议这种数据安全的替代方法?输入和输出是标准的,只是很难得到正确的代码。使用面向记录或固定格式的数据会更容易一些,但使用类似C语言的默认IO方式是基于可变长度文本的记录,或纯二进制。因此,如果大小或偏移量错误,或者有多个写入程序,可以对整个文件进行mung。如果你做了一个主文件更新,你至少应该得到一个内部一致的文件。