お世話になります。
テキストの操作について質問があります。
getline関数を使用してテキストの1行分を読み込み
その文字列をstrtok関数を使用し区切り文字ごとに配列に入れたいと考えています。
ですがgetlineはstd::string型の変数が必要でstrtok関数はchar型しか受け付けないため
関数同士で型が合わず困っています。
何とか型を合わせる方法は無いでしょうか。
以下にソースコードを記載しますのでご指導お願いします。
int main(){
using namespace std;
string strText;
char chArray[100];
ifstream fs("test.txt");
//パスで指定されたファイルから1行分の文字列を取得する
while( getline(fs , strText , '\n') ){
//区切りごと配列に入れたい
chArray = strtok(strText , ",");
}
}
No.3ベストアンサー
- 回答日時:
ん?strtok使わずにstd::string::findとstd::string::substr使えばいいんじゃないの?
int main(){
using namespace std;
string strText;
// char chArray[100];
vector<string> sArray;
ifstream fs("test.txt");
//パスで指定されたファイルから1行分の文字列を取得する
while( getline(fs , strText , '\n') ){
//区切りごと配列に入れたい
// chArray = strtok(strText , ",");
sArray.push_back(strText.substr(0, strText.find(0, ",")));
}
}
というか、このプログラムだと、各行の1項目目だけを取得することになるけど、本当にやりたいのはCSVデータを1行ごとに読みとっていくことじゃないんですか?
だとしたら、
// 文字列srcを","で分割する
// vectorを戻り値にすると余分なコピーが発生するので、分割結果はresultに格納する
// (今コンパイルもリファレンス参照もできないので間違いがあるかもしれないけど)
void splitText(vector& result, const string& src)
{
result.clear();
if (src.empty()) return;
string::size_type pos = 0;
string::size_type new_pos;
while ((new_pos = src.find(pos, ",")) != string::npos){
result.push_back(src.substr(pos, new_pos - pos));
pos = new_pos + 1;
}
result.push_back(src.substr(pos));
}
という関数を作って呼び出すか、BoostライブラリにCSV切り出しに使えるものがあるからそれを使えばいいでしょう。
回答ありがとうございます。
回答の前半部にあるソースコードを使用させていただいたら
難なく作ることが出来ました! ありがとうございました。
No.4
- 回答日時:
#3ですが すみません、2引数のsubstr呼び出しでミスをしていました。
そのままのコードでは切り出す文字列が想定より1文字分長くなり、','が文字列末に残ってしまいます。
2箇所にでてくるものをそれぞれ、
sArray.push_back(strText.substr(0, strText.find(0, ",") - 1));
result.push_back(src.substr(pos, new_pos - pos - 1));
に換えてください。
それから、前の回答に書いた「BoostライブラリにCSV切り出しに使えるものがある」という話ですが、
http://www.kmonos.net/alang/boost/classes/tokeni …
で説明されているtokenizerのことです。
Boostライブラリは
http://www.boost.org/
から入手できます。
No.2
- 回答日時:
#1です。
ちょっと追加。std::stringとは異なり、Cの文字列は代入演算子ではコピーされません。
専用の関数が用意されている(これが#1でも触れたstrcpy)のでそちらを使いましょう。
No.1
- 回答日時:
std::stringのメンバ関数c_str()を使うとconst char *型で取り出せます。
それをstrcpyで別のバッファに移すなどして処理すればいいでしょう。
なお、strtokの戻り値はchar *型ですからchArrayの宣言は間違っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
%dなどの違い
-
プログラムによく出てくるst...
-
C++で入力した文字列から数字を...
-
C#でstringをポインタとして渡す
-
VB6.0でのバイナリデータの扱い...
-
nullと""、\\0とEOFの違いにつ...
-
CSVファイルの「”」について
-
TCL言語で文字列検索方法を教え...
-
WSH(VBS)でJSONの文字列を読み...
-
VBA-DLLの引数受け渡しについて
-
16進数を2文字ずつ配列に格納し...
-
構造体→文字列→構造体 をする方法
-
C言語のコンパイル時に表示され...
-
C++で文字列の右端から特定の文...
-
char型配列の最大要素数
-
シリアル通信で0x00を送信した...
-
バイナリファイル中の日本語文...
-
文字列型の一般的な変数名は?
-
c言語によって文字列を逆順する...
-
関数から配列を返すには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#でstringをポインタとして渡す
-
プログラムによく出てくるst...
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
c#で他のアプリの文字入力フォ...
-
TCL言語で文字列検索方法を教え...
-
16進数を2文字ずつ配列に格納し...
-
シリアル通信で0x00を送信した...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
WSH(VBS)でJSONの文字列を読み...
-
VB6.0でのバイナリデータの扱い...
-
C++で文字列の右端から特定の文...
-
数字の入った配列をファイルへ...
-
%dなどの違い
-
構造体→文字列→構造体 をする方法
-
char型配列の最大要素数
-
VBA-DLLの引数受け渡しについて
-
[C++]WCHARの1文字目しか表示で...
-
Shift_JIS(16進)を文字に変換す...
-
CSVファイルの「”」について
おすすめ情報