如何将标准输出重定向到文件 - 这段代码出了什么问题?

时间:2015-06-14 15:38:29

标签: c linux ubuntu

我正在使用覆盆子pi2上的C程序和433mhz接收器来读取传输的代码。这个程序嗅探433mhz代码。

要运行它,我使用以下命令:sudo ./RFSniffer如果找到代码,程序将在控制台中显示如下内容:

Received 5204

但是,我希望能够将这些代码放在一个文件中,所以我尝试了这个:

sudo ./RFSniffer >> codes.txt

但我的 codes.txt 文件中没有附加任何内容......我不知道为什么。我的代码出了什么问题?该文件始终为空。

这是我的代码:

#include "RCSwitch.h"
#include <stdlib.h>
#include <stdio.h>

RCSwitch mySwitch;

int main(int argc, char *argv[]) {

     int PIN = 2;

     if(wiringPiSetup() == -1)
       return 0;

     mySwitch = RCSwitch();
     mySwitch.enableReceive(PIN);

     while(1) {

      if (mySwitch.available()) {

        int value = mySwitch.getReceivedValue();

        if (value == 0) {
          printf("Unknown encoding");
        } else {    

          printf("Received %i\n", mySwitch.getReceivedValue() );
        }

        mySwitch.resetAvailable();

      }

  }

  exit(0);

}

问题可能是exit(0)还是printf()而不是其他任何问题?

修改

该程序使用WiringPI lib编译,因此有一个标志' - lwiringPi'

此工具可在此处找到:https://github.com/ninjablocks/433Utils/tree/master/RPi_utils

EDIT2:

我将代码更改为:

int main(int argc, char *argv[]) {

  printf("yeah\n");
  exit(0);

}

它仅适用于:

sudo sh -c './RFSniffer >> /home/pi/433Utils/RPi_utils/codes.txt'

所以问题可能是while(1) { printf... }?或者仅在调用exit(0)时写入文件?

5 个答案:

答案 0 :(得分:2)

您正在写入默认情况下缓冲的stdout,因为我在循环中看不到任何breakreturnexit,我假设您使用Ctrl退出程序-C。

所有缓冲的值,直到被丢弃。 您应该在每次写入后简单地刷新标准输出以确保收到的内容将在您的文件中结束:

 while(1) {
  if (mySwitch.available()) {
    int value = mySwitch.getReceivedValue();
    if (value == 0) {
      printf("Unknown encoding");
    } else {    
      printf("Received %i\n", mySwitch.getReceivedValue() );
    }
    fflush(stdout);   // force immediate output
    mySwitch.resetAvailable();
  }

无论如何,不​​得不按Ctrl-C退出程序并不是很好......

答案 1 :(得分:1)

我相信你的问题是“sudo”。你确定你知道codes.txt在哪里吗?给它一个绝对路径(例如>> /tmp/codes.txt)。

答案 2 :(得分:1)

文件_locale未提供写入权限。

检查codes.txt并确认文件具有写入权限。

文件的OR路径不正确,因此请提供文件的绝对路径:

ls -l  codes.txt

替换为

sudo ./RFSniffer >> codes.txt

此链接提供了有关使用sudo进行文件重定向的更多详细信息:How do I use sudo to redirect output to a location I don't have permission to write to?

答案 3 :(得分:1)

我怀疑sudo可能正在使用不同的工作目录执行您的命令。 sudo pwd打印什么?您是否考虑在该目录中查找codes.txt

编辑:或者,可能是您的操作系统暂时存储stdout某处,直到程序关闭,此时它会写入您的codes.txt文件?如果您在此代码中每次调用exit(0);后立即注入printf会发生什么情况(或终止循环,无论如何......)

答案 4 :(得分:1)

您可以使用tee command将流数据存储在文件

您可以将其用作 ./RFSniffer | tee codes.txt