我在C中使用fopen()和fwrite()找到的就是删除所有内容并重新开始写入或附加到文件的末尾.如果我需要在文件中去一些偏移量并覆盖几个字节怎么办?
这有可能与某些功能?
我有点像C++的新手(从C#转移)所以我不确定这里发生了什么.我想要做的是从文件中读取一个图像并将其写入输出文件,但每当我执行该文件的某些部分时似乎已损坏.
我已经检查了内存中的数据并且它实际匹配,所以我认为罪魁祸首必须是fwrite(),尽管它总是只是我做错了.
以下是一些示例数据:http://pastebin.com/x0eZin6K
我的代码:
// used to figure out if reading in one giant swoop has to do with corruption
int BlockSize = 0x200;
// Read the file data
unsigned char* data = new unsigned char[BlockSize];
// Create a new file
FILE* output = fopen(CStringA(outputFileName), "w+");
for (int i = 0; i < *fileSize; i += BlockSize)
{
if (*fileSize - i > BlockSize)
{
ZeroMemory(data, BlockSize);
fread(data, sizeof(unsigned char), BlockSize, file);
// Write out the data …Run Code Online (Sandbox Code Playgroud) php 中打开文件、读取内容并随后使用基于原始内容的一些输出覆盖文件内容的最干净方法是什么?具体来说,我试图打开一个填充有项目列表(以换行符分隔)的文件,处理/添加项目到列表中,从列表中删除最旧的 N 个条目,最后将列表写回到文件中。
fopen(<path>, 'a+')
flock(<handle>, LOCK_EX)
fread(<handle>, filesize(<path>))
// process contents and remove old entries
fwrite(<handle>, <contents>)
flock(<handle>, LOCK_UN)
fclose(<handle>)
Run Code Online (Sandbox Code Playgroud)
请注意,我需要使用集群()锁定文件,以便跨多个页面请求保护它。fopen() 时的“w+”标志会起作用吗?php 手册指出它将把文件截断为零长度,所以看起来这可能会阻止我读取文件的当前内容。
我的最后一个问题没有得到很好的解释。
我在这里尝试做的是将数据插入到一个 PHP 文件中,在另一个 .php 文件上使用 fwrite 功能。
为简单起见,我将我想要插入的数据标记为 file.php,而我使用 fwrite 执行的标记为 edit.php
现在,我把写的东西记下来了,我的问题是,我需要在 file.php 上的关闭 php 标记之前插入该数据。
我尝试做的是删除关闭的 php 标签,写入数据,然后重写标签。
这是我的源代码:
<?php
$rows = file("file.php");
$tagremove = "?>";
foreach($rows as $key => $row) {
if(preg_match("/($tagremove)/", $row)) {
unset($rows[$key]);
}
}
file_put_contents("file.php", implode("", $rows));
$User = $_GET["user"];
$File = "file.php";
$Handle = fopen($File, "a");
fwrite($Handle, "");
fwrite($Handle, $User);
fwrite($Handle, "\r\n");
fwrite($Handle, "?>");
print "Data Written";
fclose($Handle);
?>
Run Code Online (Sandbox Code Playgroud)
当我在 Edit.php 上运行它时,它会将该数据插入到文件中,但它只写入第一行,并替换已经存在的任何内容。(在我的情况下,它是打开的 php 标签)。我不知道我做错了什么,或者是否有另一种方法可以做到这一点,但任何帮助将不胜感激。
编辑:这又是一个聊天客户端。
我有一个文件,它将消息发送到客户端然后读取的 .txt 文件中。
该文件正在读取 file.php (staff.php) 以检查提交的用户是否是工作人员。 …
我有一组列表项目,我读到结构.此代码应替换现有项目.用户输入位置(1..n)并应替换相应的记录.但它不起作用,记录放到文件的末尾.怎么了?
int pos;
FILE* file = fopen("file.txt", "ab+");
scanf("%d", &pos);
Schedule sch = getScheduleRecord();
fseek(file, sizeof(Schedule) * (pos - 1), SEEK_SET);
fwrite(&sch, sizeof(sch), 1, file);
fclose(file);
break;
Run Code Online (Sandbox Code Playgroud) 嗨,我有一个实时流媒体代码,我在本地主机上流式传输我的网络摄像头。
这是我的流文件代码
<?php
function flush_buffers(){
ob_end_flush();
ob_flush();
flush();
ob_start();
}
header('Content-Type: video/mpeg');
$stream = fopen( 'http://localhost:8080/stream.mp2v', "rb" );
#$save = fopen("save.mp4", "w");
while ( ! feof( $stream ) )
{
$response = fread( $stream, 8192 );
echo $response;
#fwrite($save,$stream);
flush_buffers();
}
fclose( $stream );
fclose($save);
exit();
Run Code Online (Sandbox Code Playgroud)
我需要做的是将这个实时流同时录制到一个文件中,我在我的代码中声明了 save.mp4。我尝试使用 fwrite 来做到这一点,但是当我使用此代码运行程序时,我可以看到我的网络摄像头正在运行,但它不能记录任何内容以保存.mp4。我认为 fwrite 不适合我的目的。我在这一点上需要帮助。我该怎么办?
我正在制作一个小程序如下:
void reserve_file_space(char* file_path, size_t amount)
{
FILE* fp = fopen(file_path, "w+b");
if(!fp)
{
printf("could not create a new file\n");
return;
}
int fseek_ret = fseek(fp, amount, SEEK_SET);
if(fseek_ret != 0)
{
printf("could not seek to the desired position\n");
fclose(fp);
return;
}
char garbage = 1;
size_t ret = fwrite(&garbage, 1, 1, fp);
if(ret != 1)
{
printf("could not write the garbage character\n");
}
fclose(fp);
}
int main(int argc, char* argv[])
{
reserve_file_space("C:\\Users\\SysPart\\Desktop\\test.bin", 1 << 30);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的 …
我遇到了一个问题,即使我禁用指数表示法,也会以指数表示法fwrite打印数字.一个例子:
library(data.table)
options(scipen = 999)
testint = c(500000)
Run Code Online (Sandbox Code Playgroud)
在我打印之前,r表现和不以指数表示法打印:
print(testint)
[1] 500000
print(list(testint)
[[1]]
[1] 500000
Run Code Online (Sandbox Code Playgroud)
但当我这样做时:
fwrite(list(testint), "output")
Run Code Online (Sandbox Code Playgroud)
该文件的内容是5e + 05.我怀疑这个问题可能特别适用fwrite,就像我一样:
write(testint, "output1")
Run Code Online (Sandbox Code Playgroud)
输出文件的内容为500000.
有没有办法阻止fwrite这样做?我可以切换到使用write,但它们之间存在巨大的速度差异,而且我正在编写大量数据,因此如果可能的话,我会想要避免显着的性能影响.谢谢!
编辑:如果有人有兴趣,有一个现有的开放GitHub的问题在这里,我发现后,我问的问题!
fwrite() 被声明为这样。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
Run Code Online (Sandbox Code Playgroud)
但实际写入的字节数只是 size * nmemb。那么为什么不只指定字节数呢?为什么需要同时指定 size 和 nmemb?谢谢。
我有一个非常大的 8GB 数组,uint64_t需要写入文件。由于某种原因,fwrite()只写入 290MB(正好 305,131,520 字节),然后就停止了。我的程序正在使用 CPU 的完整核心(此时它唯一的工作是写入文件),但任务管理器显示磁盘活动为 0。我必须按 Ctrl+C 来停止它。这是我将数组写入文件的代码:
void writeToFile(char* fileName, u64* array, size_t arraySize)
{
FILE* fp;
fp = fopen(fileName, "wb");
if (fp == NULL)
{
printf("Unable to write file");
}
fwrite(array, 8, arraySize, fp);
fclose(fp);
}
Run Code Online (Sandbox Code Playgroud)
如果我在 Visual Studio 中编译,它可以正常工作并写入整个数组。不过,我喜欢在 Visual Studio 中编写代码,然后使用 CodeBlocks 和 gcc 进行编译(gcc 具有更好的优化)。使用gcc编译时,无法写入超过290MB。这里有什么问题?
注意:我正在 Windows 上为 Windows 进行编译,并且该程序正在写入 Gen 4 NVMe SSD,因此写入时间应该小于 10 秒。我用的gcc是x86_64-w64-mingw32-gcc.exeCodeBlocks自带的。
编辑
好的,这是一个最小的可重现程序:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h> …Run Code Online (Sandbox Code Playgroud)