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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2846閲覧

MFC C++ CStringの改行コードを取得する

SakiTakeuchi

総合スコア13

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/09/28 06:23

編集2018/10/01 00:57

前提・実現したいこと

タブで区切られたテキスト(CString)を、二次元配列に格納したいです。
改行位置を知るにはどうしたら良いですか?

C++

1// ファイルの読み込み 2CStdioFile file; 3CString line; 4if (file.Open(m_FilePath_in, CFile::modeRead)) { 5 m_cs_original = _T(""); 6 while (file.ReadString(line)) { 7 m_cs_original += line + _T("\n"); 8 } 9} 10// 配列に格納 11CString cs_all_data = m_cs_original; 12CString cs_left, cs_right, cs_a_data; 13int r = 0, c = 0; 14for (int i = 1; i <= cs_all_data.GetLength(); i++) { 15 cs_left = cs_all_data.Left(i); 16 cs_right = cs_left.Right(1); 17 18 if (cs_right == _T(",") || cs_right == _T(" ")) { 19 m_cs_table[r][c] = cs_a_data; 20 c++; 21 cs_a_data = _T(""); 22 } 23 else if (cs_right == _T("\n")) { // 改行位置でこの処理をしたいのです。 24 r++; 25 } 26 else 27 cs_a_data = cs_a_data + cs_right; 28} 29

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

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

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

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

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

KoichiSugiyama

2018/09/28 07:22 編集

質問がちょっと情報不足です。タブで区切られたテキストと改行位置はどういう関連でしょうか? パッと考えられるのはテキストファイルに複数行の文字列が入っていて、それぞれの行がタブで区切られている文字列でできているものから、全てのデータを読み込んだCStringを対象としている風に受け取れますが、それで間違いありませんか? できればうまくいっていないコード(途中まで書いたものでも良い)を記載してください。
SakiTakeuchi

2018/10/01 01:04

コメントありがとうございます。説明がうまくできず、すみません。"タブでいくつかに区切られた文字列が複数行あるファイル"を読み込んでいます。…伝わっているでしょうか。。
guest

回答1

0

ベストアンサー

コードを見てやりたいことは何となくわかりました。
ロジックを尊重して後半部分を書き換えると

VC++

1// 配列に格納 2CString cs_all_data = m_cs_original; 3CString cs_left, cs_right; 4int r = 0, c = 0, nStart = 0; 5for (int i = 1; i <= cs_all_data.GetLength(); i++) { 6 cs_left = cs_all_data.Mid(nStart, i - nStart); 7 cs_right = cs_left.Right(1); 8 cs_right2 = cs_left.Right(4); 9 10 if (cs_right == _T(",") || cs_right == _T("\t")) { //★ 11 m_cs_table[r][c] = cs_left.Left(cs_Left.GetLength() - 1); 12 c++; 13 nStart = i; 14 } 15 else if (cs_right2 == _T(" ") { 16 m_cs_table[r][c] = cs_left.Left(cs_left.GetLength() - 4); 17 c++; 18 nStart = i; 19 } 20 else if (cs_right == _T("\n")) { 21 m_cs_table[r][c] = cs_left.Left(cs_Left.GetLength() - 1); 22 r++; 23 c = 0; 24 nStart = i; 25 } 26}

タブが半角4文字の場合はちょっと処理を分ける必要があります、タブ文字を使用している場合は"\t"で判断できますので★のようにできます。
配列m_cs_talbeは

VC++

1CString m_cs_table[256][2]; 2

みたいに宣言されている前提で使用しています。

ただ、もうちょっとスマートなやり方もあります。せっかくファイルからの読み込みの処理で1行ずつループしているのに、配列の格納にまたループを使うのはちょっと冗長ではないかと思います。
全体を書き直すと、

VC++

1// ファイルの読み込み 2CStdioFile file; 3if (!file.Open(m_FilePath_in, CFile::modeRead)) { 4 // ファイル読み込みエラー時の処理を記述 5 6 return; 7} 8CString line; 9int r = 0; 10while (file.ReadString(line)) { 11 // 読み込んだ行を分割して配列に格納 12 int nStart = 0; 13 int pos1 = line.Find(_T(",")); 14 int pos2 = line.Find(_T("\t")); 15 int pos3 = line.Find(_T(" ")); 16 if (pos1 == -1 && pos2 == -1 && pos3 == -1) { 17 // この行には区切り文字がない 18 continue; 19 } 20 21 int spos, epos; 22 if (pos1 != -1) { 23 spos = pos1; 24 epos = pos1 + 1; 25 } else if (pos2 != -1) { 26 spos = pos2; 27 epos = pos2 + 1; 28 } else if (pos3 != -1) { 29 spos = pos3; 30 epos = pos3 + 4; 31 } 32 33 m_cs_table[r][0] = line.Left(spos); 34 m_cs_table[r][1] = line.Mid(epos); 35 r++; 36}

実際に動かしていないのと正確に仕様を把握していないので、問題があるかもしれませんが、ご参考までに。

投稿2018/10/01 16:36

KoichiSugiyama

総合スコア3041

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

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

SakiTakeuchi

2018/10/02 06:05

つたない説明とコードから意図を汲んでいただき、ありがとうございます! おっしゃる通り、ファイルの読み込み時に済ますのがスマートで良いかなと思います。 そうしてしまえばもう関係ないのですが、 私のやり方では、if (cs_right == _T("\n")){…}で 改行を検出できませんでした。 たとえば AB CD のような時、”B”の次に取得されるのは”\n”ではなく”C”でした。 ”\n”をきっかけに配列を++したかったので、どうしたら改行位置が分かるのだろう…と困っていました。 ご回答いただいたコードでは、”\n”を取得することができました!が、 どういう違いなのでしょうか…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問