我的代码:
$i = 0;
$file = fopen('ids.txt', 'w');
foreach ($gemList as $gem)
{
fwrite($file, $gem->getAttribute('id') . '\n');
$gemIDs[$i] = $gem->getAttribute('id');
$i++;
}
fclose($file);
Run Code Online (Sandbox Code Playgroud)
出于某种原因,它是\n作为字符串写的,所以文件看起来像这样:
40119\n40122\n40120\n42155\n36925\n45881\n42145\n45880
Run Code Online (Sandbox Code Playgroud)
从Google开始它告诉我使用\r\n,但是\r回车似乎不是我想做的.我只是希望文件看起来像这样:
40119
40122
40120
42155
36925
45881
42145
45880
Run Code Online (Sandbox Code Playgroud)
谢谢.
....
finalize(char *hdrs, sendip_data *headers[], int index,
sendip_data *data, sendip_data *pack)
{
........
Run Code Online (Sandbox Code Playgroud)
出于调试目的,我想要一个data和pack类型的十六进制转储,它们是sendip_data一种非常复杂的结构.实际上它们包含一些二进制信息,所以我不确定我的项目的输出是否正确.因此,出于调试目的,我想将数据写入文件,以便我可以使用hexdump,如下所示 -
$hexdump -C file.txt
Run Code Online (Sandbox Code Playgroud)
另外因为这是一个/ w数据包的运行时生成所以我也不确定我认为需要的长度data和pack结构fread / fwrite.所以请给我一些建议.
我有以下测试脚本:
<?php
$myFile = "testFile.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = "Floppy Jalopy\n";
fwrite($fh, $stringData);
$stringData = "Pointy Pinto\n";
fwrite($fh, $stringData);
fclose($fh);
?>
Run Code Online (Sandbox Code Playgroud)
然而,当运行并打开usign记事本时,数据将在一行中返回而不会中断:
软盘Jalopy(疯狂的盒子)Pointy Pinto(疯狂的盒子)
我无法找到"疯狂的盒子"的合适角色,但它是一个非常疯狂的盒子.是什么赋予了!
我经常用cron加载很少的脚本.现在我不存储任何日志,所以如果任何脚本无法加载,我会看到结果之前不会知道它 - 即使我注意到结果不正确,我也做不了什么,因为我不知道知道哪个脚本失败了.
我决定存储日志,但我仍然不知道该怎么做.所以,我的问题是 - 什么更有效 - 将日志存储在sql数据库或文件中?
我可以在我的mysql数据库中创建'logs'表并将每个日志存储在单独的行中,或者我可以使用php的file_put_contents或fopen/fwrite将日志存储在单独的文件中.
我的脚本在工作时每分钟大约会增加5个日志(总计).我做了很少的测试来确定什么更快--fopen/fwrite或mysql的插入.我将一个"插入"语句循环3000次以制作3000行并循环fopen/fwrite 3000次以制作带有示例文本的3000个文件.Fwrite的执行速度比sql的插入快4-5倍.我做了第二个循环 - 我循环'select'语句并将其分配给字符串3000次 - 我还使用'fopen'打开了3000个文件并将结果分配给字符串.结果是一样的 - fopen/fwrite完成任务的速度提高了4-5倍.
那么,对于所有有经验的程序员 - 您在存储日志方面的经验是什么?有什么建议?
// 04.09.2011编辑 - 谢谢大家的答案,他们帮助了很多.每个帖子都很有价值,所以很难接受只有一个答案;-)
我有一个简短的C程序写入文件,直到磁盘上没有更多的空间:
#include <stdio.h>
int main(void) {
char c[] = "abcdefghij";
size_t rez;
FILE *f = fopen("filldisk.dat", "wb");
while (1) {
rez = fwrite(c, 1, sizeof(c), f);
if (!rez) break;
}
fclose(f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序(在Linux中)时,它会在文件达到2GB时停止.
由于FILE结构,是否存在内部限制?
谢谢.
fwrite()C中的函数const void *restrict buffer用作第一个参数,因此您可以直接将指针struct作为第一个参数传递给您.
http://en.cppreference.com/w/c/io/fwrite
例如fwrite(&someStruct, sizeof(someStruct), 1, file);
但在C++中,ostream::write()需求const char_type*会迫使您使用reinterpret_cast.(在Visual Studio 2013中,它是const char*.)
http://en.cppreference.com/w/cpp/io/basic_ostream/write
egfile.write(reinterpret_cast<char*>(&someStruct), sizeof(someStruct));
几乎在所有情况下,要写入文件的二进制数据都不是char数组,那么为什么标准更喜欢看起来更复杂的样式呢?
PS
1.实际上我write()在ofstreamwith ios::binary模式下使用了这个方法,但根据引用,它继承了ofstream.所以我ostream::write()在上面使用.
2.如果要打印字符流,可以使用operator<<().是不是write()为编写原始数据而设计的方法?
3.如果write()不是编写二进制数据的方法,那么在标准中执行此操作的方法是什么?(尽管由于不同平台上的各种内存对齐策略,这可能会影响代码的可移植性)
当字符串<?xml version通过fwrite写入文件时,后续的写入操作变慢.
这段代码:
#include <cstdio>
#include <ctime>
#include <iostream>
int main()
{
const long index(15000000);
clock_t start_time(clock());
FILE* file_stream1 = fopen("test1.txt","wb");
fwrite("<?xml version",1,13,file_stream1);
for(auto i = 1;i < index ;++i)
fwrite("only 6",1,6,file_stream1);
fclose(file_stream1);
std::cout << "\nOperation 1 took : "
<< static_cast<double>(clock() - start_time)/CLOCKS_PER_SEC
<< " seconds.";
start_time = clock();
FILE* file_stream2 = fopen("test2.txt","wb");
fwrite("<?xml versioX",1,13,file_stream2);
for(auto i = 1;i < index ;++i)
fwrite("only 6",1,6,file_stream2);
fclose(file_stream2);
std::cout << "\nOperation 2 took : "
<< static_cast<double>(clock() - start_time)/CLOCKS_PER_SEC
<< …Run Code Online (Sandbox Code Playgroud) 在PHP中,如何检查流资源(或文件指针,句柄或您想要调用它们的任何内容)是可读还是可写?例如,如果您遇到的情况是您对资源的打开或创建方式一无所知,那么如何检查它是否可读?你如何检查它是否可写?
根据我所做的测试(只使用PHP 5.3.3的常规文本文件),fread()当资源不可读时,不会在任何级别抛出任何错误.它只返回一个空字符串,但它也为空文件执行此操作.理想情况下,最好选择不修改资源本身的检查.通过尝试从中读取资源来测试资源是否可读将改变指针的位置.
相反,fwrite()当资源不可写时,不会在任何级别抛出任何错误.它只返回零.这稍微有用一些,因为如果你试图将一定数量的字节写入文件并fwrite()返回零,那么你就会知道出了什么问题.但是,这仍然不是一种理想的方法,因为在我需要写入它之前知道它是否可写会更好,而不是试图写入它并查看它是否失败.
此外,理想情况下,检查应该适用于任何类型的流资源,而不仅仅是文件.
这可能吗?有这样的事吗?我一直找不到任何有用的东西.提前感谢您的回答.
关于fwrite()中两个参数'size'和'count'的目的似乎存在很多混淆.我想弄清哪个会更快 -
fwrite(source, 1, 50000, destination);
Run Code Online (Sandbox Code Playgroud)
要么
fwrite(source, 50000, 1, destination);
Run Code Online (Sandbox Code Playgroud)
这是我的代码中的一个重要决定,因为此命令将执行数百万次.
现在,我可以跳转到测试并使用可以提供更好结果的那个,但问题是该代码适用于多个平台.
所以,
如何才能获得跨平台更好的答案?
fwrite()的实现逻辑会因平台而异吗?
我知道有类似的问题(什么是FREAD/FWRITE回吐大小的基本原理和计算作为参数?,FWRITE的性能和写入大小),但也明白,这是关于同一个问题不同的问题.在这种情况下,类似问题的答案是不够的.
覆盖文件中特定行的最佳方法是什么?我基本上想要在文件中搜索字符串'@parsethis',并用其他内容覆盖该行的其余部分.
fwrite ×10
php ×5
c ×4
fopen ×4
c++ ×2
append ×1
binary-data ×1
fat32 ×1
file ×1
file-io ×1
filesystems ×1
fread ×1
hexdump ×1
io ×1
linefeed ×1
logging ×1
mysql ×1
newline ×1
ofstream ×1
performance ×1
pointers ×1
text-files ×1
visual-c++ ×1
void ×1
xml ×1