3

Here is the code I have- not sure why I am getting this error message:

$ ./main.cpp "hello" "is"
./main.cpp: line 4: syntax error near unexpected token `('
./main.cpp: line 4: `int main(int argc, char *argv[]){'

It compiles fine in g++, but when I run it, I get the above error. Any idea why? Here is my complete code..

#include <iostream>
#include <fstream>

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

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

    if (argc != 2){
        std::cout << "\nUSAGE: 2 command line arguments please." << std::endl;
        std::cout << "\n   (1) Input file with raw event scores.\n   (2) Output file to write into.";
    }

  // open the font file for reading
    std::string in_file = argv[1];
    std::ifstream istr(in_file.c_str());
    if (!istr) { 
        std::cerr << "ERROR: Cannot open input file " << in_file << std::endl;
  }

    return 0; 
}
4

3 に答える 3

4

ソースコードではなく、コンパイルされたプログラムを実行する必要があります。

$ g++ -o main main.cpp
$ ./main "hello" "is"
3 : ./main
3 : hello
3 : is

USAGE: 2 command line arguments please.

   (1) Input file with raw event scores.
   (2) Output file to write into.ERROR: Cannot open input file hello

あなたの例は、C ++コードをシェルスクリプトとして実行しようとしていますが、これは機能しません。ここでのプログラムのテスト実行の出力からわかるように、まだ解決すべきバグがいくつかあります。

于 2013-02-06T18:54:33.987 に答える
3

他の両方の回答が言うように、暗黙的にを使用して、シェルスクリプトとして実行しています/bin/sh

で始まる最初の2行#は、シェルによってコメントとして扱われます。3行目は空白で、何もしません。4行目はコマンドとして解釈されintますが、括弧はシェルに固有のものであり、ここでは正しく使用されていません。にintコマンドが含まれて$PATHいない可能性がありますが、構文エラーが原因でシェルがそのコマンドを報告する機会はありません。

これらの詳細はどれも特に重要ではありません。問題は、プログラムを正しく実行していないことです。しかし、これらの特定のエラーメッセージが出力される理由を確認するのは興味深いかもしれません。

そして、あなたは次のようなことをしたようchmod +x main.cppです。そうでなければ、シェルはそもそもそれを実行しようとすることを拒否していたでしょう。C ++ソースファイルを実行可能にすることは(読み取りと書き込みが可能である限り)実際に害を及ぼすことはありませんが、まったく役に立ちません。また、これまで見てきたように、エラーの検出が遅れます。を実行してから再chmod -x main.cpp試行./main.cppすると、代わりに「アクセスが拒否されました」というエラーが表示されます。

Carlの回答が示すように、C ++ソースファイルではなく、コンパイラによって生成された実行可能ファイルを実行する必要があります。そのため、コンパイラがあります。chmod +xコンパイラ(実際にはリンカ)は、生成した実行可能ファイルに対して同等の処理を自動的に実行します。

このfileコマンドは、何かがどのような種類のファイルであるかを教えてくれます。これは、それを使って何ができるかに影響します。たとえば、次のコマンドを実行した後、システムでコードを使用しますg++ main.cpp -o main

$ file main.cpp
main.cpp: ASCII C program text
$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xacee0dfd9ded7aacefd679947e106b500c2cf75b, not stripped
$ 

(コマンドはCではなくC ++としてfile認識されているはずですが、推測が間違っている場合があります。)main.cpp

「ELF」は私のシステムで使用されている実行可能フォーマットです。このファイルには、実行可能マシンコードとその他の情報が含まれています。システムにプリインストールされているコマンドは同じ形式を使用します。

詳細はシステムによって異なる場合があり、MSWindowsなどの非Unixライクなシステムでは大幅に異なります。たとえば、Windowsでは、実行可能ファイルは通常、.exe拡張子が付いた名前が付けられます。

于 2013-02-06T19:14:04.777 に答える
0

コンパイラは、デフォルトで「a.out」と呼ばれる実行可能ファイルを作成するので、次のようにします。

$ a.out "hello" "is"

「./main.cpp」と入力すると、おそらくシェルスクリプトとしてC++ソースファイルを実行しようとします。

于 2013-02-06T18:55:58.873 に答える