Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ fstream替换文件的一部分_C++_Io_Fstream - Fatal编程技术网

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。如果你做了一个主文件更新,你至少应该得到一个内部一致的文件。