如何在C++代码中从shell重定向获取文件名?ie ./MyProgram <myfile,我想逐行获取myfile作为文件名及其内容.
**编辑:我设法从文件中获取输入.谢谢您的帮助.但是,在循环遍历文件内容之后,我想用cin保持用户输入.就像这样:
while (true)
{
if (cin.eof() == false)
{
getline(cin, line);
cout << line;
}else{
cin >> choice;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个ac程序,该程序监视您目录中某个位置的文件夹(程序启动时会给出位置)。它的任务之一是告诉用户该指定文件夹中存储了哪些内容。我当时正在考虑通过管道命令ls命令,但是不确定如何获取您当前不在其中的文件夹的内容。帮助?
谢谢!
我想为我在Windows中使用的Shell实现grep(仅用于学习目的).
我知道grep具有以下语法:
grep pattern files
Run Code Online (Sandbox Code Playgroud)
所以我可以做一个像这样的功能:
int grep(string stringToMatch, string fileName) // just one file
{
// search file for stringToMatch
// print line containing stringToMatch
}
Run Code Online (Sandbox Code Playgroud)
我的困惑是,当我使用这样的管道时,grep应该如何工作:
ls | grep someword
Run Code Online (Sandbox Code Playgroud)
我实现了"ls"将所有输出放在一个向量中并返回,所以我想我的grep应该在向量中搜索结果.那么正确的grep函数应该怎么样呢?我需要2个grep函数吗?
提前致谢.
Hadoop n00b在这里,刚刚开始使用Hadoop Pipes.我在使用hadoop-0.20.203(当前最新版本)编译一个简单的WordCount示例时遇到链接器错误,该示例在hadoop-0.20.2中没有出现相同的代码
表单链接器错误:HadoopPipes.cc中对"EVP_sha1"的未定义引用.
EVP_sha1(以及我得到的所有未定义引用)都是openssl库的一部分,HadoopPipes.cc来自hadoop-0.20.203,但hadoop-0.20.2没有.
我已经尝试调整我的makefile链接到ssl库,但我还是运气不好.任何想法将不胜感激.谢谢!
PS,这是我目前的makefile:
CC = g++
HADOOP_INSTALL = /usr/local/hadoop-0.20.203.0
SSL_INSTALL = /usr/local/ssl
PLATFORM = Linux-amd64-64
CPPFLAGS = -m64 -I$(HADOOP_INSTALL)/c++/$(PLATFORM)/include -I$(SSL_INSTALL)/include
WordCount: WordCount.cc
$(CC) $(CPPFLAGS) $< -Wall -Wextra -L$(SSL_INSTALL)/lib -lssl -lcrypto -L$(HADOOP_INSTALL)/c++/$(PLATFORM)/lib -lhadooppipes -lhadooputils -lpthread -g -O2 -o $@
Run Code Online (Sandbox Code Playgroud)
我正在使用的实际程序可以在http://cs.smith.edu/dftwiki/index.php/Hadoop_Tutorial_2.2_--_Running_C%2B%2B_Programs_on_Hadoop找到
我通过"runInteractiveCommand"在haskell中运行一个外部交互程序,并希望读取程序的输出,直到它显示程序提示.到目前为止我有
checkConsistency cal nets = do
(sparqIn, sparqOut, sparqErr, sparqId) <- runInteractiveCommand "sparq -i"
mapM_ (flip hSetBinaryMode False) [sparqIn, sparqOut]
hSetBuffering sparqIn LineBuffering
hSetBuffering sparqOut NoBuffering
hPutStrLn sparqIn ("load-calculus " ++ cal)
-- Here i need to wait for output and ignore it until the prompt is shown!
sparqAnswers <- mapM (checkConsistencyWithSparq sparqIn sparqOut) nets
return sparqAnswers
Run Code Online (Sandbox Code Playgroud)
我想我应该在while循环中使用"hReady"和"hGetChar",但我不确定如何完成它.或者也许有更好的方法?
亲切的问候,Annaluise
看看这段代码:
#include<stdio.h>
#include <unistd.h>
int main()
{
int pipefd[2],n;
char buf[100];
if(pipe(pipefd)<0)
printf("Pipe error");
printf("\nRead fd:%d write fd:%d\n",pipefd[0],pipefd[1]);
if(write(pipefd[1],"Hello Dude!\n",12)!=12)
printf("Write error");
if((n=read(pipefd[0],buf,sizeof(buf)))<=0)
printf("Read error");
write(1,buf,n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望printf在从管道中读取Hello Dude之前打印Read fd并写入fd.但情况并非如此......请看这里.当我在我们的大学计算机实验室尝试相同的程序时,我的输出是
Read fd:3 write fd:4
Hello Dude!
Run Code Online (Sandbox Code Playgroud)
我们的朋友也很少观察到,更改printf语句以包含更多数量的\n字符会改变输出顺序......例如.. printf("\nRead fd:%d\n write fd:%d\n",pipefd[0],pipefd[1]);意味着打印了读取fd然后打印Hello Dude!了写入fd 的消息.这是什么行为?注意:Out lab使用我们运行终端的linux服务器,但我不记得编译器版本.
我正在尝试制作一个迷你shell,其中命令是相互管道的.在代码中的某些点我做:
close(1) //closing stdout
Run Code Online (Sandbox Code Playgroud)
和
close(0) //closing stdin
Run Code Online (Sandbox Code Playgroud)
但是后来我正在分叉,所以我希望我的新子进程重置所有内容.那我该怎么做:
*function_name_here*(1) //reopening stdout
Run Code Online (Sandbox Code Playgroud)
和
*function_name_here*(0) //reopening stdin
Run Code Online (Sandbox Code Playgroud) 在我的服务器上nohup sleep 1 > nohup.out &没有提供帮助信息.好.
在我的笔记本电脑上运行相同的命令,我得到:nohup: ignoring input and redirecting stderr to stdout.虽然命令仍然正常运行并完成,但我不明白为什么在我的两台机器之间报告此消息存在差异.幸运的是,我可以通过简单地将stderr和stdout重定向到文件来解决我的笔记本电脑上的这个问题:nohup sleep 1 &> nohup.out &
所以....我想要做的是在我的笔记本电脑上实现一个更有用的命令:
以下在我的服务器上工作正常,并且没有报告消息:
nohup ls -1 *.txt | sed -e "s%\(.*\)%/home/user/scripts/script.pl -find \1 %" | sh > nohup.out &
这行代码"nohups"将一个文件管道列表导入到sed中,它们script.pl连续运行并在shell中执行.script.pl将数据打印到多个文件,并将一些信息打印到stdout.我通过将其写入名为的文件来捕获此信息nohup.out
现在,当我在笔记本电脑上运行这个单行时,我明白了nohup: ignoring input and redirecting stderr to stdout.这是预期的(但由于我不知道的原因).但是当我修改行重定向stderr和stdout时:
nohup ls -1 *.txt | sed -e "s%\(.*\)%/home/user/scripts/script.pl -find \1 %" | sh &> nohup.out &
我仍然得到消息 nohup: ignoring input and redirecting …
我有一堆myfile[somenumber]嵌套目录中的表单文件.
我想在每个文件上生成行数,并将该计数输出到文件.
这些文件是二进制文件,因此必须通过其他脚本传送open_file它们才能通过"wc"进行计数.我做:
ls ~/mydir/*/*/other_dir/myfile* | while read x; do open_file $x | wc -l; done > stats
Run Code Online (Sandbox Code Playgroud)
这是有效的,但问题是它将行计数输出到文件stats而不说原始文件名.例如,它输出:
100
150
Run Code Online (Sandbox Code Playgroud)
代替:
/mydir/...pathhere.../myfile1: 100
/mydir/...pathhere.../myfile2: 150
Run Code Online (Sandbox Code Playgroud)
第二个问题:
如果我想将数字wc -l除以常数,例如除以4,然后将其输出到文件中,该怎么办?
我知道行数是4的倍数,因此结果应该是整数.不知道如何从上面的脚本中做到这一点.
如何将原始文件名和wc -l结果放在输出文件中?
谢谢.
我正在尝试使下面的命令工作,但没有打印o/p:
tail -f mylog.log | grep --line-buffered -Eo '<S:Envelope .+Envelope>' | xmllint --format --recover -
Run Code Online (Sandbox Code Playgroud)
但是,如果我从文件中grep相同的模式,并将其传递给xmllint,它的工作原理如下:
grep --line-buffered -Eo '<S:Envelope .+Envelope>' tmp.xml | xmllint --format --recover -
Run Code Online (Sandbox Code Playgroud)
我在第一个命令中缺少什么?