質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2615閲覧

StreamReaderのReadLineをオーバーライドしたい。

obokado

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/08/08 05:41

###前提・実現したいこと
ガーバーファイルからbitmap作成関数を作ろうとしています。
ガーバーファイルを一処理ずつ読み解くため * (アスタリスク)までの文がほしいです。

###発生している問題・エラーメッセージ

The best overloaded method match for 'project名.StreamReaderGBR.StreamReaderGBR(System.IO.Stream)' has some invalid arguments Argument 1: cannot convert from 'string' to 'System.IO.Stream'

###該当のソースコード

public class gbrFile { string Path; gbrFile (string Path) { this.Path = Path; } Bitmap gbrFileConvert (Bitmap a) { using (StreamReaderGBR srgbr = new StreamReaderGBR(this.Path)) { } return a; } } class StreamReaderGBR : StreamReader { public StreamReaderGBR(Stream stream) : base(stream) { } public override string ReadLine() { int c; c = Read(); if (c == -1) { return null; } StringBuilder sb = new StringBuilder(); do { char ch = (char)c; switch (ch) { case '*': return sb.ToString(); case '%': break; default: sb.Append(ch); break; } } while ((c = Read()) != -1); return sb.ToString(); } }

###補足情報(言語/FW/ツール等のバージョンなど)
ガーバーファイルの設定項目にある%が邪魔なので読み取らないようにしています。
下記のURLを参考(コピペ)に作っています。
https://stackoverflow.com/questions/6330699/override-streamreaders-readline-method

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

これはオーバーライドに関する問題ではなく、

csharp

1using (StreamReaderGBR srgbr = new StreamReaderGBR(this.Path))

この行でStreamReaderGBRのコンストラクタにstringのthis.Pathを渡していますが、

csharp

1public StreamReaderGBR(Stream stream) : base(stream) 2{ 3}

StreamReaderGBRのコンストラクタはStreamを要求しているため、型が合っていません。
この呼び出しの前に、PathからStreamを生成する処理を挟めばまずは先に進めると思います。


ガーバーファイルというものは初めて見ましたが、これを読み取るためになにやら難しいことをやり過ぎな気がします。
結局やりたいことは、

  • ASCIIフォーマットのファイルを読み込む
  • %で始まる行を読み飛ばす
  • 行末の*を取り除いたものを返す

というものでよろしいでしょうか?
わざわざStreamReaderを継承したクラスを作らなくても、

csharp

1public static class GBR 2{ 3 public static IEnumerable<string> Read(string path) 4 => EnumerateLines(path) 5 .Where(line => !line.StartsWith("%")) 6 .Select(line => line.TrimEnd('*')); 7 8 private static IEnumerable<string> EnumerateLines(string path) 9 { 10 using (var file= new FileStream(path, FileMode.Open)) 11 using (var reader = new StreamReader(file, Encoding.ASCII)) 12 { 13 while (!reader.EndOfStream) 14 yield return reader.ReadLine(); 15 } 16 } 17}

こんな感じで列挙してしまえばいい気がします。

投稿2017/08/08 06:50

tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーについて、StreamReaderGBRのコンストラクタがStreamクラスを要求しているようですが、実際はstringクラスを要求していることが原因のようです。System.IO.File.OpenReadメソッドなどでファイルストリームを作成する必要があります。

投稿2017/08/08 06:50

skitoy4321

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問