我有一个非常大的二进制文件,我需要根据输入文件中的id创建单独的文件.有146页输出的文件,我使用cstdlib和fopen和fwrite.FOPEN_MAX是20,所以我无法同时打开所有146个输出文件.我还想最小化打开和关闭输出文件的次数.
如何有效地写入输出文件?
cstdlib由于遗留代码,我还必须使用该库.
可执行文件还必须是UNIX和Windows跨平台兼容的.
如何启用写入文件befor关闭它,我有这个代码写入文件,是这样做,但只有在我关闭应用程序后,它才能让干扰器成为简单记录器的一部分.我需要的是看到写更新(使用tail -f)
void init(char *pfileName)
{
if(pfileName != NULL)
{
fp = fopen(pfileName, "a+");
if(fp != NULL)
fseek(fp, 0, SEEK_END);
}
}
void close()
{
if(fp != NULL)
fclose(fp);
fp = NULL;
}
void write(char *pType, std::string pMsg, char *pFileName, int lineNo)
{
if(fp != NULL)
{
fprintf(fp,"%s %s %s %s %d %s\n", pType, __DATE__, __TIME__, pFileName, lineNo, pMsg.c_str());
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将div的内容保存到新的html文件中.我正在使用jQuery AJAX将数据发送到php.
但是,当前表单中的php会写一个空文件.
HTML:
<div id="data2save">
<span>data1</span>
<span>data2</span>
<span>data3</span>
<span>data4</span>
</div>
<input type="button" value="save" id="save">
Run Code Online (Sandbox Code Playgroud)
JQuery的:
$("#save").live("click",function() {
var bufferId =$("#data2save").html();
$.ajax({
method : "POST",
url : "saver.php",
data: {id : bufferId},
dataType: "html",
success: function(data){
alert("ok");
}
});
});
Run Code Online (Sandbox Code Playgroud)
PHP:
<?php
$handle = fopen("test.html", 'w+');
$data = $_POST['data'];
if($handle)
{
if(!fwrite($handle, $data ))
echo "ok";
}
?>
Run Code Online (Sandbox Code Playgroud) 我无法理解这段代码的输出?
int main()
{
FILE* f, *f1;
f = fopen("mytext", "w");
if ((f1 = fopen("mytext", "w")) == 0)
printf("unable\n");
fprintf(f, "hello\n");
fprintf(f1, "hi\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT是mytext文件中的hello.为什么不写?"无法"不打印到标准输出.
我正在写一个C模块,我遇到了一个我以前从未见过的有趣问题.
// Many other operations before this point
fseek(samples_file, 0, SEEK_SET);
printf("ftell A1 %llu\n", ftell(samples_file));
count = fwrite(channel_buffer+chan_type.size*set_index, 1, chan_type.size, samples_file);
printf("count %llu\n", count);
printf("ftell A2 %llu\n", ftell(samples_file));
// Many more operations to come after this point
Run Code Online (Sandbox Code Playgroud)
当我运行模块时,我得到如下打印输出:
ftell A1 0
count 8
ftell A2 6018
Run Code Online (Sandbox Code Playgroud)
我已将文件指针设置为文件的开头.当我写一些数据时,它应该在我寻找的位置写出数据,然后用写入的字节数增加文件位置(在本例中为8).然而,当我做一个ftell时,似乎该位置突然跳到6018(恰好是文件的原始大小加上8).
为什么会发生这种情况,如何防止这种行为?
我的代码是
<?php
$fp = fopen('test.txt', "a+");
fwrite($fp, 'Cats chase mice');
fclose($fp);
?>
Run Code Online (Sandbox Code Playgroud)
但 test.txt 仍然是空的。我没有看到任何错误,我不明白为什么它不写。
复制文件时遇到问题
码:
bool done;
FILE* fin;
FILE* fout;
const int bs = 1024*64;//64 kb
char* buffer[bs];
int er, ew, br, bw;
long long int size = 0;
long long int sizew = 0;
er = fopen_s(&fin,s.c_str(),"rb");
ew = fopen_s(&fout,s2.c_str(),"wb");
if(er == 0 && ew == 0){
while(br = fread(buffer,1,bs,fin)){
size += br;
sizew += fwrite(buffer,1,bs,fout);
}
done = true;
}else{
done = false;
}
if(fin != NULL)fclose(fin);
if(fout != NULL)fclose(fout);
Run Code Online (Sandbox Code Playgroud)
以某种方式fwrite写入整个缓冲区忽略计数值(br)
一些例子如何:
Copying 595 file of 635 DONE. 524288/524288 B …Run Code Online (Sandbox Code Playgroud) 我有大表格,用户写入的所有数据都以特殊方式处理。提交后我的表单应加载模板 php 文件并将表单中的数据添加到其中。所以我的应用程序处理 POST 数据,通过加载 php 模板file_get_contents(),并将fwrite()数据写入新的 php 文件。
但问题来了。php 模板文件中的变量按原样编写。但我需要用提交和解析的表单 POST 标头中的值替换 php 模板中的变量。
有谁知道,该怎么做?
我的简化代码:
-- form.php
<Form Action="process.php" Method="post">
<Input Name="Name1" Type="text" Value="Value1">
<Button Type="submit">Submit</Button>
-- process.php
$Array=array(
"Name1","Name2",//...
);
if(!empty($_POST)){
foreach($Array as $Value){
if(!empty($_POST[$Value])){
$Value=$_POST[$Value];
}}}
...
$Template=file_get_contents("template.php");
$File=fopen("../export/".$userid.".html","w+");
fwrite($File,$Template);
fclose($File);
-- template.php
<!Doctype Html>
...
Name1: <?=$Name1?><Br>
...
Run Code Online (Sandbox Code Playgroud)
我的目标:
-- 135462.html
<!Doctype Html>
...
Name1: Value1
...
Run Code Online (Sandbox Code Playgroud) 我fwrite用来存储一个叫QVector的值rawData.
这是我的代码:
unsigend short* ptr = rawdata();
FILE * pFile;
pFile = fopen("arrayValues.txt", "a");
fwrite(ptr, sizeof(unsigned short), sizeof(rawData), pFile);
fclose(pFile);
Run Code Online (Sandbox Code Playgroud)
上面的程序"工作"意味着我能够写入文件,当我用十六进制编辑器打开文件时,我可以看到那里的东西.但是,它只写一帧的值然后停止,即使程序一遍又一遍地调用该方法.
更奇怪的是,如果我关闭程序并再次运行它,它将打开文件(已经有最后一次运行的值),并在最后添加一组新的值.所以我知道我在追加模式下打开文件.
示例代码:
#include <stdio.h>
#include <unistd.h>
#include <sched.h>
#include <pthread.h>
int
main (int argc, char **argv)
{
unsigned char buffer[128];
char buf[0x4000];
setvbuf (stdout, buf, _IOFBF, 0x4000);
fork ();
fork ();
pthread_t this_thread = pthread_self ();
struct sched_param params;
params.sched_priority = sched_get_priority_max (SCHED_RR);
pthread_setschedparam (this_thread, SCHED_RR, ¶ms);
while (1)
{
fwrite (&buffer, 128, 1, stdout);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序打开 4 个线程,并在 stdout 上输出“buffer”的内容,该内容在 64 位 cpu 上为 128 字节或 16 个长整型。
如果我然后运行:
./写测试| pv -ptebaSs 800G >/dev/null
我得到的速度约为 7.5 GB/s。
顺便说一句,如果我这样做的话,这与我得到的速度是一样的:
$ …Run Code Online (Sandbox Code Playgroud)