2017-02-13 87 views
-2

我想沒有一些PARAMS營造出宛如more用於Linux的程序。主要思想是我需要從命令字符串中的某些參數輸出文本文件中的信息。所以我的主要觀點是more -d fileName控制檯尺寸++

我知道more輸出23串文字,和第24的是,用戶按space和獲得信息的另一個屏幕,但我需要考慮的是用戶可以更改控制檯窗口的大小。

我想使用的庫#include <sys/ioctl.h>,但它說,我不能使用這樣的庫。我究竟做錯了什麼?

我的代碼:

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 
#include <sys/ioctl.h> 

void printRecord(struct winsize w, std::vector<std::string> lines); 

int main(int argc, char *argv[]) { 
    struct winsize w; 
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); 
    std::ifstream readRecord; 
    std::string more("more"); 
    std::vector<std::string> lines; 

    std::cout << "argc: " << argc << std::endl; 
    for (int i = 0; i < argc; i++) 
    { 
     std::cout << "Argument: " << i << " = " << argv[i] << std::endl; 
    } 
    std::cout << std::endl << std::endl; 

    if (argv[1] == more) 
    { 
     std::string str; 
     //int n = atoi(argv[2]); 
     int numberPages=0; 
     readRecord.open(argv[2]); 

     while (!readRecord.eof()) 
     { 
      getline(readRecord, str); 
      numberPages++; 
      lines.push_back(str); 
     } 
     if (0 == numberPages) 
     { 
      std::cout << "ERROR: The file is empty" << std::endl; 
      exit(-1); 
     } 
     if (w.ws_row > numberPages) 
     { 
      printRecord(struct winsize w, lines); 
     } 
     else 
     { 
      printRecord(struct winsize w, lines); 
     } 
    } 

    return 0; 
} 
void printRecord(struct winsize w,std::vector<std::string> lines) 
{ 
    for (int i = 0; i < w.winsize::ws_row; i++) 
    { 
     std::cout << lines[i] << std::endl; 
    } 
} 

錯誤:

Source.cpp: In function ‘int main(int, char**)’: 
Source.cpp:12:11: error: ‘STDOUT_FILENO’ was not declared in this scope 
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); 
Source.cpp:44:16: error: expected primary-expression before ‘struct’ 
printRecord(struct winsize w, lines); 
Source.cpp:48:16: error: expected primary-expression before ‘struct’ 
printRecord(struct winsize w, lines); 
+1

「但它說,我不能用這樣的庫」 - 誰這麼說?你有編譯器錯誤嗎?你也可以看看它是如何在'less'程序的linux下的源代碼,這是可以[點擊這裏]完成(http://www.greenwoodsoftware.com/less/)。 – Axel

+0

@Axel是的,我有一個編譯器錯誤。感謝您的支持! –

+2

@NikitaGusev:我們不是通靈,你真的應該包括錯誤。 – MSalters

回答

4

的問題是,你使用的

#include <sys/ioct1.h> 

,並有一個錯字:而不是l。嘗試使用:

#include <sys/ioctl.h> 

代替