编译后的代码无法解释“没有这样的文件或目录”

时间:2019-05-25 18:38:27

标签: g++

以下复制和修改的代码读取空格键,以激活从连接的测试设备捕获数据。没有下面总结的中间代码,它运行良好。我通过创建kbrd命名空间并仅使用所需的标准命令来避免“使用命名空间std”。该代码可以轻松编译,但是当我使用必要的代码来运行它以捕获键盘数据并初始化测试设备时,它会运行到“ Check point Alpha”并等待。当我按下空格键(或其他任何键!)时,它会打印:

Check Point Beta
No such file or directory.

使用鼠标左键收集数据的非常相似的代码按预期运行。我正在建造一台小型计算机,使用“纸”显示器在户外便携式使用,并且希望使用不需要鼠标的代码...

我已经用光了很多东西,试图解决这个问题。我们要求您的帮助,将不胜感激。

    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <linux/input.h>
    #include <string.h>
    #include <stdio.h>
    #include <iostream>
    #include <fstream>
    #include <signal.h>
    #include <float.h>
    #include <sa_api.h>
    #pragma comment(lib,"sa_api.lib")
    #undef max
    #undef min

   namespace kbrd{   
     const char *dev = "/dev/input/event3";
     struct input_event ev;
     ssize_t n;
     int fd;}

   using std::cin;
   using std::cout;
   using std::__cxx11::string;
   using std::endl;
   using std::ofstream;
   using std::ios;

   int main(void)
   {
    [[Code which 
      Initiates equipment API, prompts screen & reads keyboard to 
      gather details to be stored with data from attached test 
      equipment...]]`

    while (N_az <Num_Samples) {

      kbrd::fd = open(kbrd::dev, O_RDONLY);
      if (kbrd::fd == -1) {
        fprintf(stderr, "Cannot open %s: %s.\n", kbrd::dev, 
        strerror(errno));
        return EXIT_FAILURE;
      }
      //and then read keyboard events from the device:
      cout << "Check Point Alpha" << endl;
      while (1) {
        kbrd::n = read(kbrd::fd, &kbrd::ev, sizeof kbrd::ev);
        if (kbrd::n == (ssize_t)-1) {
          if (errno == EINTR)
            continue;
          else
            break;
        } else
        if (kbrd::n != sizeof kbrd::ev) {
          errno = EIO;
          break;
        }
        cout << "Check Point Beta" << endl;

        if (kbrd::ev.type == EV_KEY && kbrd::ev.value == 0 /*&& 
            kbrd::ev.value <= 2 */&& kbrd::ev.code == 57){
          cout << "Check Point Charlie" << endl;            

          continue;

          [[ Code to read attached test gear & store data, one point at a 
             time...]]

          N_az = N_az + 1;
        }
        else {
          fflush(stdout);
          fprintf(stderr, "%s.\n", strerror(errno));
          return EXIT_FAILURE;
        }
      }
    } 

   return EXIT_SUCCESS;
 }

1 个答案:

答案 0 :(得分:0)

  

当我按下空格键(或其他任何键!)时,它会打印:

Check Point Beta
No such file or directory.

因为您的代码是

   cout << "Check Point Beta" << endl;

   if (kbrd::ev.type == EV_KEY && kbrd::ev.value == 0 /*&& 
       kbrd::ev.value <= 2 */&& kbrd::ev.code == 57){
     cout << "Check Point Charlie" << endl;            
     ...
   }
   else {
     fflush(stdout);
     fprintf(stderr, "%s.\n", strerror(errno));
     return EXIT_FAILURE;
   }

这意味着(kbrd::ev.type == EV_KEY && kbrd::ev.value == 0 /*&& kbrd::ev.value <= 2 */&& kbrd::ev.code == 57)为假,没有这样的文件或目录来自 strerror ,因此您之前在某处出错,并且可能不在 read ,在 read 之前将 errno 重置为0。当没有错误时警告 errno not 重置为0,仅在出现错误的情况下设置,因此您有责任将其重置为0。 >

只需在测试前临时写入 kbrd :: ev.type / kbrd :: ev.value / kbrd :: ev.code 的值,然后运行程序以了解什么时候是什么值您按下空格键可以修改代码