• ベストアンサー

テキストfileの入力、変換、出力

javaを始めたばかりのものです。 機能概略: (1)テキストfile "in.c"をbuf[]に読み込む (2)buf[]の内容を変換する。 (3)テキストfile "out.c"にbuf[]の内容を書き出す 問題点: ・コンパイルは、OK。 ・実行時、下記 エラ-メッセ-ジがでてしまいます。 Exception in thread "main" java.lang.NoSuchMethodError: main ・ポインタ-が無いので、値渡しで渡して、値をかきかえることは無理? 以下 ソ-ス _002.JAVA import java.io.*; class ChangeData { //コンストラクタ ChangeData() { } /*++ 指定されたファイル名を読み込み*/ void SetInputData(String inputFile, byte bBuf[], int iInCntMax) { //ファイルの読み込み処理を記述 //iInCntMaxに読み込みサイズを設定 } /*++ データの変換処理 */ //ファイルの変換処理を記述 //この処理はまだ未記述 /*++ 指定されたファイルへ書き込み*/ void PutOutputData(String inputFile, byte bBuf[], int iInCntMax) { //ファイルの書き込み処理を記述 //iInCntMaxサイズ分 //iInCntMaxに読み込みサイズを設定 } }/*end クラス*/ /* メインルーチン----------------------------*/ class _002 { public static void main() { int iInCntMax,iOutCntMax;/*入力/出力buf長*/ ChangeData data = new ChangeData(); byte bBuf[] = new byte[0x100]; iInCntMax=iOutCntMax=0; data.SetInputData("in.c",bBuf,iInCntMax); data.PutOutputData("out.c",bBuf,iOutCntMax); } }

  • Java
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.3

もう一つ質問があったのですね。 ・ポインタ-が無いので、値渡しで渡して、値をかきかえることは無理? という件ですが、一般論としてはa-kumaさんの回答の通りです。 が、ご質問のソースの中にある //iInCntMaxに読み込みサイズを設定 というのは、無理です。 とりあえず、この場合は、関数の戻り値の型をintにしてそこへ返してしまう のが手っ取り早い解決法ですが、本当はもう少しオブジェクト指向の基本的な 考え方を勉強して欲しいところです。 (ヒントだけ言うと、ChangeDataというのは名前からして手続き指向です。 「読み込まれたデータ」を表すクラスが一つあれば足りるケースだと思います。)

その他の回答 (3)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.4

あ、そうか。 Java の main メソッドは、引数なしはありません。常に public static void main( String[] args ) です。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

ChangeData クラスのメソッドにpublic指定が無いので、 他クラスのメソッドであるmain()から見えないのだと思います。 void SetInputData( → public void SetInputData( void PutOutputData( → public void PutOutputData( としたら良いのでは。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

試していないのですが、 > ・実行時、下記 エラ-メッセ-ジがでてしまいます。 > Exception in thread "main" java.lang.NoSuchMethodError: main エラーメッセージ通りで、class _002 のメソッド main() で、存在しない メソッドを呼ぼうとしています。多分 ChangeData クラスのメソッドだと 思います。メソッド名と、その引数の方を再確認しましょう。 > ・ポインタ-が無いので、値渡しで渡して、値をかきかえることは無理? Java はポインターと呼んでいないだけで、ほとんどが「参照」ですから、 心配するに及びません。

komahara
質問者

補足

publicに変更してためしましたが、 やはり Exception in thread "main" java.lang.NoSuchMethodError: main のメッセ-ジがでてしまいます。

関連するQ&A

  • javaによるファイル送信のプログラム

    ユニキャスト通信のおけるプログラミングで、1のプログラムを2のプログラムを使ってファイル送信ができるようにしたいのですがうまくいきません。私のjavaの知識が授業についていかなくて図書館でいろいろと本を探したのですが見つかりませんでした。誰か教えていただけませんか? /*1*/ import java.net.*; import java.io.*; public class udpechoServer{ static final int echo_PORT = 7; //エコーポート番号 static final int BUFSIZE = 1024; //バッファサイズ public static void main(String[] args) throws IOException{ int port = echo_PORT; //ポート番号 int cliport; //クライアントポート番号 int len; //データ長 int i; //キーインバッファクリアインデックス DatagramSocket sock = null; //データグラムソケット宣言,初期化 byte[] buf = new byte[BUFSIZE]; byte[] wbuf = new byte[BUFSIZE]; String recvdata; //受信データ try{ sock = new DatagramSocket(port); DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE); DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE); System.out.println("Connected to echo server"); while(true){ sock.receive(recvpacket); //データ受信 recvdata = new String(recvpacket.getData(),0,recvpacket.getLength()); recvdata = recvdata.trim(); //トリミング(CRLF) wbuf = recvdata.getBytes(); //文字列→バイト配列変換 i = 0; len = wbuf.length; buf = new byte[BUFSIZE]; while(wbuf[i] != 0x0d){ //途中のCR検出 buf[i] = wbuf[i]; //データコピー i++; if(i >=len){ break; } } recvdata = new String(buf,0,i); //バイト配列→文字列変換 System.out.println(recvdata); //画面出力 InetAddress ipadr = recvpacket.getAddress(); cliport = recvpacket.getPort(); buf = recvdata.getBytes(); len = buf.length; sendpacket = new DatagramPacket(buf,len,ipadr,cliport); sock.send(sendpacket); //データ送信 recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット } }catch(SocketException e){ e.printStackTrace(); } } } /*2 */ import java.io.*; class FileCopy { public static void main(String argv[]){ try{ InputStream in = new FileInputStream(argv[0]); //入力ファイルを開く //BufferedInputStreamオブジェクトの生成 BufferedInputStream bin = new BufferedInputStream(in); OutputStream out = new FileOutputStream(argv[1]); //出力ファイルを開く //BufferedOutputStreamオブジェクトの生成 BufferedOutputStream bout = new BufferedOutputStream(out); byte buf[] = new byte[1024]; int c; //読み込みデータがなくなるまで読み込み while((c = bin.read(buf, 0, buf.length)) != -1){ bout.write(buf, 0, c); //データの書き込み処理 } System.out.println("\""+argv[0]+"\" was converted into \""+argv[1]+"\""); bin.close(); //入力ファイルを閉じる bout.close(); //出力ファイルを閉じる }catch(Exception e){} } }

    • ベストアンサー
    • Java
  • テキストファイルから読み取り配列にあてはめソート

    宿題できなくてあせってます。 宿題の内容は、テキストファイル(textstrs.txt)の内容を読み取ってARRAYに入れて 以下がテキストファイルの中身 3 Jones, Chris C Ferguson, Tom J Pryor, Richard P 一番初めのナンバーをARRAYのスロット数となり、そのスロットに 以下の3人の名前をあてはめ、アルファベット順に並び替えしたものを コンソールとテキストファイル(strsdataout.txt)に書くというものです。 今の段階は、まず読んでそのままコンソールに出すところですが それさえうまくいきません。とほほ 誰かわかる方おしえていただけますか。 import java.util.Scanner; import java.io.*; public class StringProject5 { //#1 public static void main(String[] args) throws Exception { //#2 // Create a File instance java.io.File inputFile = new java.io.File("D:\\teststrs.txt"); java.io.File outputFile = new java.io.File("D:\\strdataout.txt"); // Create Scanner for the file Scanner input = new Scanner(inputFile); FileReader in = new FileReader(inputFile); java.io.PrintWriter out = new java.io.PrintWriter(outputFile); BufferedReader br = new BufferedReader(in); int size = input.nextInt(); String[] strarray = new String[size]; int x = 0; while (input.hasNext()){ // while String ln = input.nextLine(); strarray [x] = ln; x++; } // end of while for (int i = 0; i < strarray.length; i++){ // for loop System.out.println(strarray[i]); //writing array in console }// end off for loop } //#2 } //#1*/

  • テキストファイルが読み込めない

    みなさんはじめまして、下記ソースなんですが「FileInputStream fi = new FileInputStream(inputFile);」の手前までは処理が流れるの ですが、その後の処理が流れなくて困っています。 ターゲットとなる「test.txt」ファイルはHTML・JAVAソースファイル クラスファイルと同じフォルダに存在します。 特に保存先等を指定していないので、必然的に同じフォルダ内を見てフ ァイルを読み込みに行くんですけど、読み込まず、そのまま処理が流れ てしまいます。 どこかやり方がいけないところがあるんでしょうか? public String FileInput(){ byte data[] = new byte[16]; String number = ""; try { File inputFile = new File("test.txt"); FileInputStream fi = new FileInputStream(inputFile); /* データを読み込み */ if(fi.read(data)== 16){       /* 0バイト目から9バイト目までを読み込み */ if(new String(data,0,9).equals("010105502")){         /* 0バイト目から16バイト目までをnumberに代入 */ number = new String(data,0,16); } } fi.close(); } catch(FileNotFoundException e){ e.printStackTrace(); } catch(IOException e){} return(number); }

    • ベストアンサー
    • Java
  • 同時にファイル読み込み 書き込み

    現在、ヒストグラムのプログラムを作成しています。 まず0~255の1000個の乱数ファイルdata.txtを読み込み、 ヒストグラムは出来たのですが、 エクセルでグラフを作りたいので、 data1.txtに書き込みたいので、下のソースでやってみましたが、 0~255のカウントが全部0になってしまします。 fp = fopen("data1.txt","w");が無ければ正常に処理されます。 どうか教えてください。よろしくお願いします。 #include <stdio.h> #define BUF 10 #define MAX 256 void count(FILE *fp , int* counter); int main(void) { FILE *fp; fp = fopen("data.txt","r"); fp = fopen("data1.txt","w"); int counter[MAX]; int i; for(i=0 ; i<MAX ; i++) { counter[i] = 0; } count(fp , counter); for(i=0 ; i<MAX ; i++) { printf("%d %d\n" , i, counter[i]); } fclose(fp); return 0; } void count(FILE* p_file , int* counter) { char buf[BUF]; while (fgets(buf , BUF , p_file) != NULL) { int n; sscanf(buf , "%d" , &n); counter[n]++; } }

  • 固定長データのbyteスキップについて

    バイナリ入出力でご質問がございます。 下記の例のように各レコードにある 先頭5byte付与されたデータを スキップ(破棄)して 各レコード10byteずつ読み込みたいのですが なにかサンプルデータもしくは アドバイス頂けないでしょうか? どうぞよろしくお願い致します。 例 1レコード 10byte (先頭5byte付与) LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 ↓ 1234567890 1234567890 1234567890 1234567890 1234567890 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.io.ByteArrayOutputStream; public class dat{ public static void main(String[] args) { String inputFileName = ""; String outputFileName = ""; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); try { FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(outputFile); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] buf = new byte[17]; int len = 0; while ((len = bis.read(buf, 0, 17)) == 17) { bos.write(buf, 0, 17); } bos.flush(); bos.close(); bis.close(); } catch(Exception e) { e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • 中身が同じような関数を一つの関数にしたい

    void C_Commu::Recv( vector<void *> Data ) { ----BYTE *Buf; ----int TotalSize, RecvSize; --------TotalSize = Data.size()*sizeof(Data[0]); --------Buf = new BYTE[TotalSize]; --------while( RecvSize < TotalSize ) --------{ ------------RecvSize += recv( Sock, (char *)Buf, TotalSize-RecvSize, 0 ); --------} --------memcpy( &Data[0], Buf, TotalSize ); } このような関数を作ってみたのですが、 C_Commu::Recv( Data->CharaNum ); //vector<char> CharaNum C_Commu::Recv( Data->Model ); //vector<S_Model> Model(S_Modelは構造体) としてみると 'C_Commu::Recv' : 1 番目の引数を 'std::vector<_Ty>' から 'std::vector<_Ty>' に変換できません。 とエラーになります。 使いたい動的配列が違うだけで残りは同じ関数なので一つに纏めてみたのですがどうしてエラーになるのか分かりません。 どのようにしたらいいのでしょうか?

  • javaのbyte配列へintなどを埋め込む方法

    javaのbyte配列へintなどを埋め込む方法 java初心者です。データ編集がわからなくて悩んでいます。 下記のコードは"棒読みちゃん"といソフトへのTCPパケットを作成するコードです。 char buf[15]; *((short*)&buf[0]) = 0x0001; *((short*)&buf[2]) = speed; *((short*)&buf[4]) = tone; *((short*)&buf[6]) = volume; *((short*)&buf[8]) = voice; *((char* )&buf[10]) = 2; *((long* )&buf[11]) = len; 同じことをJAVAでしたいのですがわかりません。 (バイト型配列へint,long型を簡単に埋め込む方法がわかりません) よろしくお願いします。 よかったら、こちらもお願いします memcpy(&buf[15],message,strlen(messege)); TCPパケットのようなデータ処理が頻繁にある場合、 このようなコードは、どうしたらいいでしょうか? *((unsigned char* )&buf[15]) = message; CとJAVAになってますが、このような処理を簡単に書けないでしょうか?

    • ベストアンサー
    • Java
  • Oracle BLOB→Byte→.tif の変換

    こんばんわ。 タイトル通り、OracleのBLOB型の画像データをjavaのByte型に変換し、それをtiffファイルに変換したいのですが、Javaを始めたばかりで調べてもわかりませんでした。みなさんのお力をお借りしたいのですが・・・。 とりあえず、以下のソースでBLOB型のデータを取得し、byte型に変換まではできたのですが、これからこのバイトデータを.tifファイルへと変換するのがどうしてもわかりません。 ご回答お願いいたします。 ---------------------------------------------------------------- public class Image{ private byte[] imgData; public Blobconvert() { } public Blobconvert(byte[] image) { this.imgData = imgData; } public Blobconvert(InputStream imgData) throws IOException { byte[] buf = new byte[4096]; ByteArrayOutputStream bos = new ByteArrayOutputStream); while (true) {    int len = imgData.read(buf); if (len == -1) break; bos.write(buf, 0, len); } this.imgData = bos.toByteArray(); bos.close(); } public Blobconvert(Blob imgData) throws SQLException, IOException { this(imgData.getBinaryStream()); } } ---------------------------------------------------------------- Blob blbImage = rs.getBlob("SendFile");//SQL文の結果 Blobconvert listModel = null;          if (blbImage != null) listModel = new Blobconvert(blbImage); else listModel = new Blobconvert(); ----------------------------------------------------------------

  • 2つのコードの違いについて

    以下は間違ったコードですが、コード1では”不正な処理~”が出ますがコード2では出ません。 同じコードに思えるのですが、どうして違いが出るのですか? <コード1> void func(void) {  void *buf1[10];  static int i;  for (i = 0; i < 100; i++) {   buf1[i]=0 ;  } } int main(void) {  int buf[1000];  func();  return 0; } <コード2> int main(void) {  int buf[1000];  void *buf1[10];  static int i;  for (i = 0; i < 100; i++) {   buf1[i]=0 ;  }  return 0; }

  • ファイル出力で改行を入れたい!

    data.txtにファイル出力を行うのですが、gets(c)で入力した一語一語に改行を入れてdata.txtに出力したいのですがどうすればよいでしょうか。 返答のほどよろしくお願いいたします。 include<stdio.h> #define SIZE 20 void main(void) { char c[SIZE], *p; FILE *fp; fp = fopen("data.txt","w+"); p = c; while(gets(c) != NULL){ fputs(p,fp); } fclose(fp); printf("data.txtへ出力しました\n"); }