标签: filehandle

通过stdin和ostream将数据发送到程序.(C++)

我想将我的C++程序中的数据发送到外部管道,如下所示:

FILE* file = popen("my_prog -opt | other_prog", "w");
std::ostream fileStream = some_function(file);
fileStream << "some data";
Run Code Online (Sandbox Code Playgroud)

我知道没有简单的,跨平台的方式来做第二行,但有没有办法用其他东西来完成同样的事情popen?我不需要使用popen,但我确实需要使用ostream.它需要使用clanggcc至少进行编译,但最好能与任何编译器一起使用.我也可以改变我处理管道的方式,但是我没有源my_progother_prog.

c++ popen filehandle ostream

10
推荐指数
1
解决办法
945
查看次数

写入STDOUT和打开到"/ dev/tty"的文件句柄有什么区别?

这两个例子之间有什么区别?

#!/usr/bin/perl
use warnings;
use 5.012;
my $str = "\x{263a}";


open my $tty, '>:encoding(utf8)', '/dev/tty' or die $!;
say $tty $str;
close $tty;

open $tty, '>:bytes', '/dev/tty' or die $!;
say $tty $str;
close $tty;

# -------------------------------------------------------

binmode STDOUT, ':encoding(utf8)' or die $!;
say $str;

binmode STDOUT, ':bytes' or die $!;
say $str;
Run Code Online (Sandbox Code Playgroud)

perl stdout filehandle tty

9
推荐指数
1
解决办法
3629
查看次数

Python相当于使用管道将文件输出到Perl中的gzip

我需要弄清楚如何将文件输出写入Python中的压缩文件,类似于下面的双线程:

open ZIPPED, "| gzip -c > zipped.gz";
print ZIPPED "Hello world\n";
Run Code Online (Sandbox Code Playgroud)

在Perl中,这使用Unix gzip将打印到ZIPPED文件句柄的任何内容压缩到文件"zipped.gz".

我知道如何使用"import gzip"在Python中执行此操作,如下所示:

import gzip
zipped = gzip.open("zipped.gz", 'wb')
zipped.write("Hello world\n")
Run Code Online (Sandbox Code Playgroud)

但是,这非常缓慢.根据分析器,使用该方法占用了我运行时间的90%,因为我将200GB的未压缩数据写入各种输出文件.我知道文件系统可能是问题的一部分,但我想通过使用Unix/Linux压缩来排除它.这部分是因为我听说使用同一模块进行解压缩也很慢.

python compression gzip pipe filehandle

9
推荐指数
2
解决办法
4252
查看次数

Perl在Python中的__DATA__等价物

在perl中编写代码时,我经常从__DATA__脚本末尾的文件句柄中读取数据:

while (<DATA>) {
    chomp;
    say;
}
__DATA__
line1
line2 
Run Code Online (Sandbox Code Playgroud)

我发现测试代码等比读取文件更快,因为这意味着我可以动态编辑其内容.

来自doc:

__DATA__标记告诉编译Perl代码完成perl的编译器.

__DATA__令牌之后的所有内容都可通过文件句柄进行读取FOOBAR::DATA,其中是到达令牌FOOBAR时当前包的名称__DATA__.

Python中有相应的东西吗?如果没有,任何人都可以建议实现类似事物的最多Python方法吗?

python perl filehandle

9
推荐指数
1
解决办法
1247
查看次数

如何使用严格到位的perl一次处理一行多行字符串?

我试图弄清楚正确的PBP批准的方法,一次处理一行多行字符串.许多Perl程序员建议将多行字符串视为文件句柄,除非你的脚本中有"use strict",否则它可以正常工作.然后,您会收到编译器的警告,指出在使用严格的refs时无法使用字符串作为符号.

这是一个简单的问题工作示例:

#use strict;
use warnings; 

my $return = `dir`;
my $ResultsHandle = "";
my $matchLines = "";
my $resultLine = "";
open $ResultsHandle, '<', \$return;
while (defined ($resultLine = <$ResultsHandle>)) {
    if ($resultLine =~ m/joe/) {
        $matchLines = $matchLines . "\t" . $resultLine;
    }
}
close($ResultsHandle);
print "Original string: \n$return\n";
print "Found these matching lines: \n$matchLines\n";
Run Code Online (Sandbox Code Playgroud)

请注意,"use strict"行已注释掉.当我在没有使用严格的情况下运行此脚本时,我得到了我想要的和期望的:

Original string: 
 Volume in drive D has no label.
 Volume Serial Number is 50D3-54A6

 Directory of D:\Documents and Settings\username\My Documents\Eclipse\myTestProject …
Run Code Online (Sandbox Code Playgroud)

string perl multiline filehandle

8
推荐指数
2
解决办法
1万
查看次数

支持autovivified文件句柄作为Perl XS例程的参数

如何在XS函数中支持autovivified文件句柄参数?

我是XS包装一个返回文件描述符的C函数,我想以open()的方式将该文件描述符呈现为perl文件句柄参数.例如,

myfunc(my $fh) or die "Error: $!";
do_something_with_fh($fh);
Run Code Online (Sandbox Code Playgroud)

到目前为止我做了什么

现在我在XS函数的顶部使用perl包装器:

# -- in perl
sub myfunc {
    my $fd = _myfunc();
    return open($_[0], '+<&=', $fd) if defined($fd);
}

/* -- in XS */
SysRet
_myfunc()
    CODE:
    RETVAL = some_c_function_returning_an_fd();

    OUTPUT:
    RETVAL
Run Code Online (Sandbox Code Playgroud)

这适用于Just Fine(tm),但是,我再次将实现完全转移到XS中.

到目前为止,我已经尝试sv_2io了一个类型为mapmap的参数SV *,但是在未定义的标量上引发了一个异常.我没有尝试将第一个参数映射到一个FILE *或一个PerlIO *对象,因为我不知道我将如何"fdreopen"(如果你愿意)这些对象.

perl filehandle xs

8
推荐指数
1
解决办法
202
查看次数

为什么Perl open()文档使用两种不同的FILEHANDLE样式?

open函数文档显示open()as 的语法:

  • 打开FILEHANDLE,EXPR
  • 打开FILEHANDLE,MODE,EXPR
  • 打开FILEHANDLE,MODE,EXPR,LIST
  • 打开FILEHANDLE,MODE,REFERENCE
  • 打开FILEHANDLE

在示例中,它们具有正常的$ -prefixed变量用于文件句柄的位置:

open(my $fh, "<", "input.txt")
Run Code Online (Sandbox Code Playgroud)

以及使用裸字的示例:

open(FOO, "|tr '[a-z]' '[A-Z]'");
Run Code Online (Sandbox Code Playgroud)

一个问题是每个样式的名称是什么,在每种情况下"我正在使用_ _作为文件句柄"?另一种是,为什么他们开始使用裸字open()文档中?它似乎是后来的用途都不涉及正常的文件名open().在这些情况下,$ -prefixed表单是不可接受的吗?

perl filehandle bareword

8
推荐指数
1
解决办法
663
查看次数

如何通过JGit克隆repo后释放文件系统锁

我正在使用jGit克隆远程现有仓库,遵循指南:

https://github.com/centic9/jgit-cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/CloneRemoteRepository.java

我正在使用CFML作为我的例子:

Git = createObject( 'java', 'org.eclipse.jgit.api.Git' );

localPath = createObject( 'java', 'java.io.File' ).init( expandPath( 'temp' ) );

result = Git.cloneRepository()
        .setURI( 'https://github.com/github/testrepo.git' )
        .setDirectory( localPath )
        .call();

result.close();
Run Code Online (Sandbox Code Playgroud)

克隆工作得很好,但在temp\.git\objects\pack我停止Java进程之前,文件锁不会在"pack"文件中发布.

然后我也注意到API文档对于结果.close()方法的行为似乎有些过于谨慎:http: //download.eclipse.org/jgit/site/4.0.1.201506240215-r/apidocs/org/eclipse/jgit/ LIB/Repository.html#close()方法

减少使用次数,并可能关闭资源.

也许?那是什么意思?为了"放弃任何底层资源",我需要做什么,如AutoCloseable.close()方法帮助实现的接口中指定的那样?

在SO上有几个类似的问题,但没有一个涉及使用静态方法org.eclipse.jgit.api.Git来克隆新的repo.

java filehandle jgit

8
推荐指数
1
解决办法
1397
查看次数

我可以使用 Text::CSV_XS 来解析 csv 格式的字符串而不将其写入磁盘吗?

我从供应商那里得到了一个“csv 文件”(使用他们的 API),但他们所做的只是把整个事情都吐到他们的响应中。这不会是一个重大问题,当然,除了那些讨厌的人中的一些输入数据并放入诸如换行符之类的“功能”之外。我现在正在做的是为原始数据创建一个文件,然后重新打开它以读取数据:

open RAW, ">", "$rawfile" or die "ERROR: Could not open $rawfile for write: $! \n";
print RAW $response->content;
close RAW;

my $csv = Text::CSV_XS->new({ binary=>1,always_quote=>1,eol=>$/ });
open my $fh, "<", "$rawfile" or die "ERROR: Could not open $rawfile for read: $! \n";

while ( $line = $csv->getline ($fh) ) { ...
Run Code Online (Sandbox Code Playgroud)

不知何故,这似乎……不雅。似乎我应该能够从 $response->content (多行字符串)中读取数据,就好像它是一个文件一样。但我对如何做到这一点完全空白。一个指针将不胜感激。谢谢,保罗

csv perl filehandle

8
推荐指数
2
解决办法
372
查看次数

尝试打印到已关闭的文件句柄没有错误或警告

在下面的小代码中,我没有收到行 [09] 和 [18] 的错误或警告。我得到的唯一警告是第 [21] 行:

use strict;                                              # [01]
use warnings FATAL => 'unopened';                        # [02]
                                                         # [03]
open(my $outHandleA, ">outputA.txt") or die ("A: $!\n"); # [04] Opened $outHandleA
print $outHandleA "FILE A\n";                            # [05]
close $outHandleA;                                       # [06] Closed $outHandleA
                                                         # [07]
print $outHandleA;                                       # [08]
print $outHandleA "ABC\n";                               # [09] <---
print $outHandleA;                                       # [10]
print "-----";                                           # [11]
                                                         # [12]
open(OUT, ">outputB.txt") or die ("B: $!\n");            # [13] Opened OUT
print OUT "FILE B\n";                                    # …
Run Code Online (Sandbox Code Playgroud)

perl warnings filehandle

7
推荐指数
1
解决办法
144
查看次数

标签 统计

filehandle ×10

perl ×7

python ×2

bareword ×1

c++ ×1

compression ×1

csv ×1

gzip ×1

java ×1

jgit ×1

multiline ×1

ostream ×1

pipe ×1

popen ×1

stdout ×1

string ×1

tty ×1

warnings ×1

xs ×1