PHP5引入了面向对象的文件包装器SplFileObject。我想我刚刚发现为什么几乎没有人使用它。它纯粹是面向行的,没有fread()方法——相应的frwite似乎暗示了这一点。所以现在我想知道是否可以扩展它。但是,我不确定什么是更好的解决方法。SplFileObject在隐藏文件指针($fp)方面并不是特别有用——它要么是私有(private)属性,要么是ZE内部资源。那么我该如何扩展它以获得fread方法呢?将fread()实现为字符串收集与fgets()的循环,如果仅请求特定大小并且fgets读取过多直到下一个\n换行符,则最终寻求。使用自定义构造函数,它会第二次打开文件并存储
在PHP中,SPLFileObject允许将文件视为迭代器。但是有一个行为我不明白。当您在对象上调用next()时,它会增加key()的值,但不会前进文件中的行,除非您在每次迭代时调用current()。SPL文档声明key()返回当前行号。重现代码:测试.txt0123迭代器.phpcurrent()."\n";//prints0echo$fi->key()."\n";//prints0$fi->next();$fi->next();$fi->next();echo$fi->current()."\n";//prints1,expecting3echo$fi->key()."\n";
当读取csv文件中的特定行时,我尝试将SplFileObject::fseek与fgetcsv一起使用。为了读取第2行(例如),我执行了fseek(1)并使用fgetcsv读取,这给出了第2行。当我执行fseek(0)并使用fgetcsv读取时,我有第0行。因此,以这种方式读取第1行存在问题。(我知道我可以连续阅读2行,但不认为它很好)。我发现2008年PHP5.2.6版报告了这个问题:SplFileObject:fgetcsvafterseekreturnswrongline.我使用的是PHP版本5.4.19。有人知道这方面的信息吗?这是故意的吗? 最佳答
我有一个TXT文件,我需要打开它并在末尾添加一个新行。我正在使用SplFileObject:$file=newSplFileObject($this->fileName,'w');$file->fwrite('mytext'.PHP_EOL);但是会删除所有文件内容,只在里面保存'我的文本'。 最佳答案 我将“w”标志替换为“a”标志。'w'打开文件但将指针放在开头,而'a'将指针放在结尾。感谢@andrewsi提供此解决方案。 关于php-使用SplFileObject向现有TXT文件
我编写了一个类,而不是扩展SplFileObject以打开CSV并具有关联数组。它有效,但如果csv文件使用CR换行符则无效。我知道你可以像这样转换字符串换行符:$string=str_replace($this::CRLF,$string::LF,$file);$string=str_replace($this::CR,$string::LF,$file);但我想知道如何在我的构造函数中转换换行符。我如何创建我的文件:$file=newCSVFile(__DIR__.'/../../Resources/data/myfile.csv');类CSVFile.phpuse\SplFile
在问这个问题之前,我已经阅读了文档并广泛搜索了这个网站。$file=newSplFileObject("/var/www/qacentre/compliance/compliance.csv");$file->setFlags(SplFileObject::READ_CSV);foreach($fileas$row){}示例CSV行;"ABEL,TAMMY454454","Endof:ABEL,TAMMY454454",QP544454,28/10/201211:41,"0811非法使用、拥有","STEPHENS,JEREMY54544454",LINK操作,定位细节不正确,实体:F
使用PHP遍历csv文件时SplFileObject和READ_CSV标志我得到一个带有null值的额外行。有没有办法自动删除此行?$file=newSplFileObject(__DIR__.'/technologies.csv','r');$file->setFlags(SplFileObject::READ_CSV);foreach($fileas$row){var_dump($row);}这将生成一个具有null值的行。...array(1){[0]=>NULL} 最佳答案 您还想设置SplFileObject::SKIP_
是否可以取消文件与SplFileObject的链接?我没有看到关闭底层资源的方法,并且文件句柄是私有(private)的,因此不能以此为目标扩展SplFileObject。有什么解决方法吗? 最佳答案 我不推荐这样做,因为PHP会在后台为您关闭文件。如果您查看phpsrc,ext/spl/spl_directory.c:retval.handle=zend_objects_store_put(intern,(zend_objects_store_dtor_t)zend_objects_destroy_object,(zend_obj
$file=newSplFileObject('/path/to/file.txt');如何使用SplFileObject查找文件中的行数? 最佳答案 iterator_count和使用next()的逐行迭代在Ubuntu下的php5.3.7版本中被破坏。似乎也损坏了fseek([anyoffset],SEEK_END)方法。key()返回0。使用seek($lineCount)遍历大文件太慢了。最简单的5.3.7验证方式是//forcetoseektolastline,won'traiseerror$file->seek($fil
我正在使用SplFileInfo和SplFileObject在PHP中处理文件。但是当我尝试“重新打开”一个文件时,它对我大喊:SplFileObject::__construct(filemame):failedtoopenstream:Permissiondenied我想我应该先关闭我的文件,然后再重新打开它,但我不知道该怎么做。SplFile*没有close函数?! 最佳答案 你应该设置SplFileObject为null以关闭文件。 关于php-如何关闭SplFileObject