Visual C++ 2008 Express Edition 環境です。
入力テキストファイルを読み込み、空白で単語を区切り、単語すべてをmapにいれるという処理のプログラムを書こうとしています。
perlでいうところのsplit, 配列へのpushをC++でstrtokとmapでならかけると思いました。
入力ファイルは
input1.txt---------------
cat dog mice human
mosquito beetle spider
-------------------------
プログラムは
#include <stdio.h>
#include<iostream>
#include <map>
#include <vector>
int main( )
{
FILE *input_file1;
input_file1 = fopen("input1.txt", "r");
char str[256];
char *token;
std::vector<char *> my_vector; //
while (fgets(str, 256, input_file1) != NULL) {
token = strtok( str , " " );
while( token != NULL ){
my_vector.push_back(token) ;
printf("%s\n",token);
token = strtok( NULL , " " );
}
}
printf("starting vector loop\n");
std::vector<char *>::iterator it = my_vector.begin(); //
while( it != my_vector.end() ) //
{
printf("%s\n",*it);
++it; //
}
fclose(input_file1);
return 0;
}
というふうにしました。
cat
dog
mice
human
mosquito
beetle
spider
というような出力がなされるものと思ったのですが、実行してみると
mapを使ったループ(全要素)出力は
mosquito
uito
le
mosquito
beetle
spider
というふうに出力されてしまいます。
strtokで単語を分ける部分は問題なく出力で確認できるので、問題はmapの作り方やポインタだと思うのですが原因がわかりません。
問題点、解決策がお分かりになる方、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
map 関係ないですよね。
直接的な原因は strtok で得られたポインタが str 配列の位置を指しているので、行を読むたびに str の中身は書き換えられているためです。
ポインタを vector に入れるのではなくて、文字列をコピーして入れるように変更しましょう。
また、空白で区切られているなら、ファイルから ifstream を作成して
operator>> で読み込んだ方が楽だと思います。
この回答への補足
ありがとうございます。
>ポインタを vector に入れるのではなくて、
>文字列をコピーして入れるように変更しましょう。
strtokのあつかいがまだよくわかっていないのですが、
トークンをstringにコピーというのは
token = strtok( NULL , " " );
std::string mojiretu ;
mojiretu = token;
my_vector.push_back(mojiretu) ;
このようにするのでしょうか?
No.2
- 回答日時:
それだと my_vector を std::vector<char *> ではなく std::vector<std::string> で定義することになりますよね.
で, そうなら実は my_vector の定義を変えればいいだけだと思います. std::string のコンストラクタは push_back で自動的に呼び出されるんじゃないかな.
この回答への補足
アドバイスありがとうございます。
std::vector<std::string> my_vector;
std::string str1 = "*token" ;
my_vector.push_back(str1) ;
としてみたのですが、
出力が(null)となってしまいます。
perlで非常に適当にやっていたことがC++では私にとっては非常に難しく混乱していますが、もうすこし粘ってみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
リモートデスクトップの接続元I...
-
C++ 平均値、最大値と最小値の...
-
VC++で文字列から任意の文字を...
-
VxWorks 6.4ソケット接続につい...
-
wstringの主力
-
構造体配列のvectorへの変換と...
-
標準の例外の全種類と、発生す...
-
C言語プログラミングにて、関数...
-
セグメンテーションフォルトが...
-
なぜ、C++の標準ヘッダをインク...
-
dynamic_cast exception: __non...
-
平均値を関数を用いて出力した...
-
C++文字配列ソート関数を教えて...
-
_CRT_SECURE_NO_DEPRECATE が効...
-
C++で、環境変数の読み込み方を...
-
gccでコンパイル時のエラー
-
指定した文字を削除したい
-
#include "fstream.h"
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++で文字列から任意の文字を...
-
構文エラーが出ているのですが...
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
C++での <iostream.h>と<iostre...
-
#include "fstream.h"
-
#define中の#のエスケープ
-
JPEGやPNGが読めるLoadImage関数
-
リモートデスクトップの接続元I...
-
string型のフォーマット書式指...
-
CStringとString
-
std::map の const 修飾について
-
VHDLのsignedとunsignedの違いは?
-
このプログラミング誰か教えて...
-
指定した文字を削除したい
-
構造体配列のvectorへの変換と...
-
C言語のポインターで詰まっている
おすすめ情報