标签: filehandle

当我尝试使用Perl读取文件时,为什么会出现"Bad File Descriptor"?

我试图一次读取一个40字节的二进制文件,然后检查所有这些字节是否为0x00,如果是,则忽略它们.如果没有,它会将它们写回另一个文件(基本上只是删除大块的空字节).

这可能不是最有效的方法,但我并不担心.但是,现在我收到了"错误的文件描述符"错误,我无法弄清楚原因.

my $comp = "\x00" * 40;
my $byte_count = 0;

my $infile = "/home/magicked/image1";
my $outfile = "/home/magicked/image1_short";

open IN, "<$infile";
open OUT, ">$outfile";
binmode IN;
binmode OUT;
my ($buf, $data, $n);
while (read (IN, $buf, 40)) { ### Problem is here ###
  $boo = 1;
  for ($i = 0; $i < 40; $i++) {
    if ($comp[$i] != $buf[$i]) {
      $i = 40;
      print OUT $buf;
      $byte_count += 40;
    }
  }
}
die "Problems! $!\n" if $!;

close …
Run Code Online (Sandbox Code Playgroud)

perl filehandle

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

4参数 - 选择 - 问题

来自SELECT_TUT:

"...用于有效地监视多个文件描述符,以查看它们中的任何一个是否已成为"准备好";也就是说,查看I/O是否成为可能,或者是否出现"异常情况"描述符....

那么select()有什么意义呢?我不能随时随地读写我的描述符吗?select()的意思是它同时监视多个描述符,并在没有活动时正确地将进程置于休眠状态.Unix程序员经常发现他们必须处理来自多个文件描述符的I/O,其中数据流可能是间歇性的.如果你只是创建一个read(2)和write(2)调用序列,你会发现你的一个调用可能会阻止等待来自/到文件描述符的数据,而另一个文件描述符虽然已经准备就绪但未被使用/ O.select()有效地应对了这种情况."

有人可以解释我,这意味着什么以及如何运作,也许只是一个小例子.

例如,这里只选择一个文件句柄,为什么我需要监控?

my $timeout = 10;
my ( $in, $out ) = ( '', '' );
vec( $in, fileno( STDIN ), 1 ) = 1;
select( $out = $in, undef, undef, $timeout );
Run Code Online (Sandbox Code Playgroud)

perl select file-descriptor filehandle

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

Perl:通过文件句柄循环

我是一名自学成才的Perler,寻求Perl专家的帮助:

我一直收到一个错误,说我不能在foreach循环中使用文件句柄,即使我确定close它(或者undef它,我已经尝试过).请在此处查看完整错误:http://cl.ly/image/2b2D1T403s14

该代码可在GitHub上获得:https://github.com/bsima/yeast-TRX

有问题的代码可以在第90行的"script.pl"文件中找到:

foreach my $species (keys %Saccharomyces) {
    open(RAW,">./data/$species/$geneName/raw.csv");
        print RAW "gene,dinucleotide,position,trx.score,energy.score\n";
    undef RAW; 
    open(SMOOTH,">./data/$species/$geneName/smooth.csv");
        print SMOOTH "gene,position,trx.score,energy.score\n";
    undef SMOOTH;
}
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助!我不知道Perl如何处理文件句柄的复杂性,可能是因为我缺乏正式的培训.如果有人感觉特别有帮助,那么对我的整体代码质量的任何评论也是受欢迎的.

编辑:发现问题.Perl无法动态生成目录,因此$species/$geneName甚至都没有创建目录.我在foreach循环的开头添加了一行简单说明mkdir("$species/$geneName");并解决问题.

perl for-loop filehandle file-handling

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

python:使用文件句柄打印文件的内容

我遵循以下建议: 文件作为argparse的命令行参数 - 如果参数无效 以打印文件内容,则出现错误消息.这是一个MWE:

import argparse
import os


def is_valid_file(parser, arg):
    """

    :rtype : open file handle
    """
    if not os.path.exists(arg):
        parser.error("The file %s does not exist!" % arg)
    else:
        return open(arg, 'r')  # return an open file handle


parser = argparse.ArgumentParser(description='do shit')
parser.add_argument("-i", dest="filename", required=True,
                    help="input file with two matrices", metavar="FILE",
                    type=lambda x: is_valid_file(parser, x))

args = parser.parse_args()

print(args.filename.read)
Run Code Online (Sandbox Code Playgroud)

但是,我得到的不是文件内容:

<built-in method read of _io.TextIOWrapper object at 0x7f1988b3bb40>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

python filehandle argparse

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

在路径中指定用于打开新文件的数组变量

虽然我在perl中找到了很多关于如何在for循环中打开文件的帖子,但我在创建目录中的文件(也是数组变量)时遇到了一个特定的问题 -

我正在使用打开文件

foreach my $dir (@listofdirs) {

open (my $OUTFILE, '>', "$dir/$dir.txt") or die "$!"; 
Run Code Online (Sandbox Code Playgroud)

,这不会创建一个文件,并给我一个错误没有这样的文件或目录.

如果我只是使用open (my $OUTFILE, '>', "$dir.txt") or die; 它工作并在我执行脚本的主目录下创建一个文件.

如何控制/指定路径以便在每个$ dir变量(目录)中打开一个文件?如果早些时候已经解决了这个问题,我很抱歉,但我不确定指定新文件路径的正确方法是什么.

编辑 -

我可以更改循环内创建文件的目录,并且每次都为其分配$ dir变量值吗?

perl filehandle

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

Perl中的文件句柄的内置名称是什么?

perl -f ref列出的名称似乎都不是文件句柄.以下代码返回GLOB,因此似乎filehandle内部映射到或作为typeglob进行管理.那是对的吗?

open FH, '>', "out.txt";
my $ref = \*FH;
print "ref \$ref:", ref $ref, "\n";
Run Code Online (Sandbox Code Playgroud)

文件句柄是否有自己的类型名称?

perl filehandle

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

读取时Perl DATA文件句柄为空

我有一个带有模板的Perl模块(由模块模块处理)存储在文件末尾的__DATA__和__END__关键字之间.尝试使用模板生成文件时,生成的文件为空,没有警告或错误输出.调试之后,我发现DATA文件句柄在传递给Template模块之前实际上是空的.

此模块的先前版本能够从DATA正确读取模板,但我所做的任何更改都不应影响此部分代码.这些更改包含完全独立函数中的逻辑更改,并将以下use语句添加到模块:

use DBI;
use DBI::Const::GetInfoType;
use Switch;
Run Code Online (Sandbox Code Playgroud)

我已经尝试在perl模块上添加写权限(它最初是只读的)并删除了__END__关键字,因为我发现这不是必需的.不幸的是,DATA文件句柄仍然显示为空.

什么样的问题可能导致DATA文件句柄为空,并且这些问题中的任何一个都适用于我的情况?我使用的是perl v5.12.5.

perl filehandle

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

使用 FileHandler 写入文件时出现的问题

我有一个看起来像这样的代码:

let fileName = "name.txt"
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
try! "".write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)
let fileHandle = try! FileHandle(forWritingTo: fileURL)
fileHandle.seekToEndOfFile()
Run Code Online (Sandbox Code Playgroud)

这段代码有效。但是,如果我删除该行:

try! "".write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)
Run Code Online (Sandbox Code Playgroud)

我得到运行时异常。我不确定为什么需要这条线?

filehandle ios swift3

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

将文件句柄变量从 STDOUT 重新分配给没有 undef() 的文件时,Perl 的奇怪行为

执行以下简化代码时:

use strict;                                          # [01]
use warnings FATAL => 'unopened';                    # [02]
                                                     # [03]
my ($inHandle, $outHandle) = (\*STDIN, \*STDOUT);    # [04]
print $outHandle "STDOUT  1\n";                      # [05]
                                                     # [06]
# $outHandle re-assigned to outputA.txt ???          # [07]
open($outHandle, ">outputA.txt") or die ("A: $!\n"); # [08]
print $outHandle "FILE A\n";                         # [09]
print             "STDOUT? 2\n";                     # [10]
print STDOUT      "STDOUT  3\n";                     # [11]
close $outHandle;                                    # [12]
                                                     # [13]
# $outHandle is closed                               # [14]
print STDOUT      "STDOUT  4\n";                     # …
Run Code Online (Sandbox Code Playgroud)

perl warnings stdout filehandle

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

资源泄漏或误报

我有这样的代码:

std::string getInfo(FILE *fp)
{
    char buffer[30];
    if (fread(buffer, 19, 1, fp) == 1)
        buffer[19] = '\0';
    else
        buffer[0] = '\0';

    return buffer;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 cppcheck 进行静态分析,它会发出警告:

error: Resource leak: fp [resourceLeak]
 return buffer;
 ^
Run Code Online (Sandbox Code Playgroud)

在我看来,由于返回是按值计算的,因此数据将从“缓冲区”复制到 std::string 的存储中,因此不会发生泄漏。

这会带来一些真正的问题还是误报?

c++ static-analysis filehandle file-pointer cppcheck

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