首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从文件或标准读取

从文件或标准读取
EN

Stack Overflow用户
提问于 2010-08-16 16:16:38
回答 6查看 118.3K关注 0票数 31

我正在编写一个实用程序,它可以接受文件名,也可以从标准输入中读取。

我想知道最健壮/最快的方法来检查stdin是否存在(数据正在通过管道传输到程序),如果存在,则读取该数据。如果它不存在,处理将在给定的文件名上进行。我试过使用下面的测试stdin的大小,但我相信由于它是一个流而不是一个实际的文件,它不会像我想象的那样工作,它总是打印-1。我知道我总是可以在!= EOF的时候一次读取输入的1个字符,但是我想要一个更通用的解决方案,这样我就可以得到一个fd或一个文件*,如果存在stdin,那么程序的其余部分就可以无缝地运行。我也想知道它的大小,悬而未决的流已经被以前的程序关闭。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long getSizeOfInput(FILE *input){
  long retvalue = 0;
  fseek(input, 0L, SEEK_END);
  retvalue = ftell(input);
  fseek(input, 0L, SEEK_SET);
  return retvalue;
}

int main(int argc, char **argv) {
  printf("Size of stdin: %ld\n", getSizeOfInput(stdin));
  exit(0);
}

终端:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ echo "hi!" | myprog
Size of stdin: -1
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-16 16:58:56

首先,让程序通过检查errno来告诉您哪里出了问题,这是在失败时设置的,例如在fseekftell期间。

其他人(tonio和LatinSuD)解释了处理标准输入而不是检查文件名的错误。也就是说,首先检查argc (参数计数),看看是否有任何指定为if (argc > 1)的命令行参数,将-视为表示stdin的特殊情况。

如果没有指定参数,那么假设输入来自stdin,这是一个而不是文件,并且fseek函数在它上面失败。

在流的情况下,您不能使用面向磁盘文件的库函数(即fseekftell),您只需计算在收到EOF (文件结束)之前读取的字节数(包括尾随换行符)。

对于大文件的使用,您可以通过使用字符数组的fgets来加快速度,以便更有效地读取(文本)文件中的字节。对于二进制文件,您需要使用fopen(const char* filename, "rb"),并使用fread而不是fgetc/fgets

您还可以在使用字节计数方法时检查feof(stdin) / ferror(stdin),以检测从流读取时的任何错误。

下面的示例应该是C99兼容和可移植的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

long getSizeOfInput(FILE *input){
   long retvalue = 0;
   int c;

   if (input != stdin) {
      if (-1 == fseek(input, 0L, SEEK_END)) {
         fprintf(stderr, "Error seek end: %s\n", strerror(errno));
         exit(EXIT_FAILURE);
      }
      if (-1 == (retvalue = ftell(input))) {
         fprintf(stderr, "ftell failed: %s\n", strerror(errno));
         exit(EXIT_FAILURE);
      }
      if (-1 == fseek(input, 0L, SEEK_SET)) {
         fprintf(stderr, "Error seek start: %s\n", strerror(errno));
         exit(EXIT_FAILURE);
      }
   } else {
      /* for stdin, we need to read in the entire stream until EOF */
      while (EOF != (c = fgetc(input))) {
         retvalue++;
      }
   }

   return retvalue;
}

int main(int argc, char **argv) {
   FILE *input;

   if (argc > 1) {
      if(!strcmp(argv[1],"-")) {
         input = stdin;
      } else {
         input = fopen(argv[1],"r");
         if (NULL == input) {
            fprintf(stderr, "Unable to open '%s': %s\n",
                  argv[1], strerror(errno));
            exit(EXIT_FAILURE);
         }
      }
   } else {
      input = stdin;
   }

   printf("Size of file: %ld\n", getSizeOfInput(input));

   return EXIT_SUCCESS;
}
票数 16
EN

Stack Overflow用户

发布于 2010-08-16 16:31:33

你想错了。

你要做的是:

如果stdin存在,请使用它,否则请检查用户是否提供了文件名。

你应该做的是:

如果用户提供了文件名,则使用该文件名。否则使用stdin。

您无法知道传入流的总长度,除非您将其全部读取并保持缓冲。你就是不能向后寻找管道。这是管道工作方式的限制。管道并不适用于所有任务,有时需要中间文件。

票数 24
EN

Stack Overflow用户

发布于 2010-08-16 16:22:44

例如,您可能想看看在cat实用程序中是如何做到这一点的。

请参见代码here。如果没有文件名作为参数,或者是"-",则使用stdin作为输入。即使没有数据被推送到stdin,它也会存在(但是,您的read调用可能会一直等待下去)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3495092

复制
相关文章
使用Termux在Android上运行SSH服务器
借助出色的Termux终端仿真器应用程序,您可以在Android上运行SSH服务器。
用户5005176
2021/08/10
4.6K0
linux服务器ssh文件传输—scp使用指南
这个问题可烦恼很久了,之前用ftp传输文件相当麻烦,但是这次使用打ssh,则简单有效。
十四君
2019/11/27
2.2K0
在Windows上使用PuTTY进行SSH连接
PuTTY是一个用于Windows和UNIX系统的免费开源SSH客户端。它可以轻松连接到运行SSH守护程序的任何服务器,因此您可以像登录到远程系统上的控制台会话一样工作。
文艺复兴
2018/09/10
21.6K0
在Windows上使用PuTTY进行SSH连接
在Linux服务器上安装Web SSH--SSHwifty的部署和使用
SSH,其全称是Secure Shell(安全外壳协议)是一种加密的网络传输协议。SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令,即:远程Terminal登录。
Mintimate
2021/06/01
11K0
在Linux服务器上安装Web SSH--SSHwifty的部署和使用
我可以在不source脚本的情况下将变量从Bash脚本导出到环境中吗
有没有一种方法可以通过只执行 export.bash 而不 source 它获取 $VAR?
程序熵
2023/09/25
2310
我可以在不source脚本的情况下将变量从Bash脚本导出到环境中吗
在Mac上使用ssh-key免密码登录服务器
从很早之前开始,在搭建测试服务器的时候,就不停的谷歌怎么免密登录服务器,每次配置好免密登录后,到搭建新的服务器时,又忘记了具体的命令,所以决定把这个方法记下来,方便之后日后查找。
Originalee
2018/08/30
5K0
Linux环境下SVN代码库从旧服务器迁移到新服务器的步骤详解
曾几何时我也是个能糊弄就糊弄的小白,不知道是年级大了还是其他什么别的原因所致,遇到问题不在敷衍,总想着解决问题,就好比这次,因为旧主机磁盘已满想着续费不划算就趁着阿里搞活动新购一台,但是之前的数据多而杂且项目带有SVN库,如果是简简单单迁移还好说,毕竟备份恢复就完成了,这次我想着能不能把SVN也备份到新服务器直接使用,最终在我测试了36个小时之后得到的答案是【可以】,不然也不会有这篇文章了吧,哈哈~可能是因为比较笨,用时较长,哎反正不管怎么说这次SVN的备份和迁移算是尘埃落地,以下是我此次备份和迁移的过程。
李洋博客
2023/11/17
1.7K0
Linux环境下SVN代码库从旧服务器迁移到新服务器的步骤详解
在 Linux 上保护 SSH 服务器连接的 8 种方法
本周赠书:一文理解分布式开发中的服务治理 来源:https://www.linuxmi.com/secure-ssh-connections-linux.html SSH 是一种广泛使用的协议,用于安全地访问 Linux 服务器。大多数用户使用默认设置的 SSH 连接来连接到远程服务器。但是,不安全的默认配置也会带来各种安全风险。 具有开放 SSH 访问权限的服务器的 root 帐户可能存在风险。尤其是如果您使用的是公共 IP 地址,则破解 root 密码要容易得多。因此,有必要了解 SSH 安全性。 这是
程序猿DD
2022/07/27
1.2K0
在 Linux 上保护 SSH 服务器连接的 8 种方法
工位上的Python——简单SSH服务器
最近在看python网络方面的知识,发现使用socket编写一些小的服务器真是太方便了,简单几行代码就能实现一个服务器,真是高大上呀,废话少说,直接上代码:
py3study
2020/01/09
1.3K0
在新服务器上搭建wordpress网站
0.首先在购置好服务器后,选一个常用的系统,一般是ubuntu 14.04 不建议用一键安装包,还是自己走一边流程熟悉点。
十四君
2019/11/26
4.1K0
在本地服务器上使用Python脚本处理HTML表单
要在本地服务器上使用 Python 处理 HTML 表单,可以使用 Flask 框架,这是一个轻量级的 web 框架,特别适合快速构建和处理 HTTP 请求。
华科云商小徐
2024/09/09
1130
使用SSH密钥在Git服务器上免密码提交代码
在使用Git进行版本控制时,每次提交代码时都要求输入用户名和密码,这对于频繁提交的开发者来说会显得十分繁琐。通过配置SSH密钥,可以实现免密码提交代码,既提升了工作效率,也增强了安全性。本文将介绍如何在Git服务器上使用SSH密钥进行身份验证,替代每次输入账户密码的方式。
alanzeng
2025/01/14
1000
MySql在服务器上使用问题的总结
服务器是Windows Server 2012,我自己安装了一个MySql数据库,然后一个Web程序和客户端程序都想访问数据库,但是遇到一堆问题。主要是我仍然坚持使用.net 2.0,挂接MySql.Data 6.7.4版本。解决后记录一下
用户1075292
2023/05/03
1.1K0
MySql在服务器上使用问题的总结
Navicat 使用 SSH 方式连接腾讯云服务器上的 MySQL
在配置完服务器上的 MySQL 后,在准备使用 Navicat 直接连接 MySQL。这时发现无法使用 Navicat 直接通过公网 IP 连接 MySQL。
求和小熊猫
2020/11/25
13.9K0
Navicat 使用 SSH 方式连接腾讯云服务器上的 MySQL
在Linux使用Bash脚本命令
tee命令的默认行为是覆盖指定的文件,与>运算符相同。 要将输出附加到文件,请使用-a(--append)选项调用命令:
用户5005176
2021/08/10
2.1K0
在Linux系统中创建SSH服务器别名
如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地址等。此外,它避免了在 SSH 到 Linux 服务器时重复输入相同的用户名、主机名、IP 地址、端口号。
星哥玩云
2022/07/27
4.1K0
在Linux系统中创建SSH服务器别名
新加坡服务器上如何实现自动脚本运行
在新加坡服务器上运行脚本涉及几个关键步骤,包括连接到服务器、上传脚本、配置环境以及实际执行脚本。以下是详细的步骤指南,适用于Linux服务器:
jtti
2024/05/21
1280
4.2 服务器上的 Git - 在服务器上搭建 Git
这里我们将要演示在 Linux 服务器上进行一次基本且简化的安装所需的命令与步骤,当然在 Mac 或 Windows 服务器上同样可以运行这些服务。 事实上,在你的计算机基础架构中建立一个生产环境服务器,将不可避免的使用到不同的安全措施与操作系统工具。但是,希望你能从本节中获得一些必要的知识。
shaonbean
2019/05/26
4K0
在JBOSS服务器上使用Myfaces的JSF实现
JBOSS AS服务器默认使用的JSF实现是SUN的RI,要把他替换成Myfaces需要:
EltonZheng
2021/01/22
8510
服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的
本文讲解的是:做为前端开发人员,对服务器的了解还是小白的我,是如何一步步将 node+mongodb 项目部署在阿里云 centos 7.3 的服务器上,并进行性能优化,达到页面 1 秒内看到 loading ,3 秒内看到首屏内容的。
夜尽天明
2019/11/13
1.7K0
服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的

相似问题

检查字符串是否跟在python regex中的特定字符串列表之后

16

Python get字符串紧跟在参数开关之后

30

如何让列跟在特定列之后?

110

Bash脚本-紧跟在特定短语之后的条目

12

使用Xpath选择紧跟在特定节点之后的特定节点

210
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文