C++でcsvファイルから文字列を取得するというものを作っているのですが、うまく取り出すことができません。ファイルはオープンできて、文字列にも分けられているのだとは思うのですが、どこのデータを表示させても"1aa"としか表示されません。なにも格納されていない所は"1aa"とは表示されず空白ですが。

以下に取り出す際使用しているコードを記載するので、うまい具合にいくアドバイスがありましたらお願いします。


↓で格納させる場所を作っています。
typedef struct
{
char* Input;
char* Output;
char* AddName;
char* Path;
char* LED;
int VS;
char* Title;
char* Copy;
} csvdata_t;

csvdata_t csvdata[100]として別の場所で宣言してます

↓この関数で格納させています
void loadData(){
    FILE *fp;
   fp = fopen(csvTitle,"r");//ここでのファイルパスは通っています
   int n,num,i;
       int input[1024];
char inputc[1024];
for(i = 0; i < 1; i++)//最初の1行読み飛ばす
while(fgetc(fp) != '\n');
n = 0;
num = 0;

while(1){
for(i = 0;i < 64; i++){
inputc[i] = input[i];// = fgetc(fp);//1文字取得する
input[i] = fgetc(fp);
if(inputc[i] == '/'){//スラッシュがあれば
while(fgetc(fp) != '\n');//改行までループ
i = -1;//カウンタを最初に戻して
continue;
}
if(input[i] == ',' || input[i] == '\n'){//カンマか改行なら
inputc[i] = '\0';//そこまでを文字列とし
break;
}
if(input[i] == EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){
case 0: csvdata[n].Input = inputc;break;
case 1: csvdata[n].Output = inputc;break;
case 2: csvdata[n].AddName = inputc;break;
case 3: csvdata[n].Path = inputc;break;
case 4: csvdata[n].LED = inputc;break;
case 5: csvdata[n].VS = atoi(inputc);break;
case 6: csvdata[n].Title = inputc;break;
case 7: csvdata[n].Copy = inputc;break;
case 8: break;
}
num++;
if(num == 9){//9まできたら
num = 0;//0に戻す
n++;//次の行へ
}
}
EXFILE:
fclose(fp);
}

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>void loadData(){


>    FILE *fp;
>   fp = fopen(csvTitle,"r");//ここでのファイルパスは通っています
>   int n,num,i;
>       int input[1024];
>char inputc[1024];

inputc[]は「ローカル変数」で間違いないですかね?

>switch(num){
>case 0: csvdata[n].Input = inputc;break;
>case 1: csvdata[n].Output = inputc;break;
>case 2: csvdata[n].AddName = inputc;break;
>case 3: csvdata[n].Path = inputc;break;
>case 4: csvdata[n].LED = inputc;break;
>case 5: csvdata[n].VS = atoi(inputc);break;
>case 6: csvdata[n].Title = inputc;break;
>case 7: csvdata[n].Copy = inputc;break;
>case 8: break;
>}

で、ローカル変数へのポインタを代入しているようですが…
さて「ローカル変数」の寿命(有効期間)はいつまでだったか学習しましたか?
# csvdata[n].VSだけポインタではなく数値の代入なので正しく動作するかと。

>どこのデータを表示させても"1aa"としか表示されません。

ただの偶然です。
不正終了してもまったく不思議のないコードになってます。
で、どのデータも同じアドレス指していますから、「どこのデータ」だろうが同じ動作します。
# ポインタに入っているアドレス確認してみましょうね。

>うまい具合にいくアドバイスがありましたらお願いします。

個別に、動的にメモリ確保して保持して下さい。
もちろん、不要になったら破棄して下さい。
malloc()/free()とかですね。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
頂いたアドバイスを元に試行錯誤の上、なんとか思い通りによみ込めるようになりました。

お礼日時:2011/04/18 08:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVisual C++ 6.0とVisual C++ 2005 についてですが・・・

Visual C++ 6.0でワークスペースと呼ばれていた物がVisual C++ 2005になるとソリューションと言う名前になったと聞きました。
また、Visual C++ 6.0で製作したファイルはVisual C++ 2005でも開けるけどVisual C++ 2005製作したファイルはVisual C++ 6.0では開けないと聞いたのですがVisual C++ 2005製作したファイルをVisual C++ 6.0でも開ける様に互換性を持たせる方法はありませんか?
学校と家で使っている環境が違うので互換性がもてれば両方で使えてとても便利になります。
御存知の方がいましたら御伝授お願いします。

Aベストアンサー

ソースファイルやヘッダファイル(拡張子CPP/C/H/HPPなど)はVisual C++ 6.0と2005で共用できるので、6.0用のプロジェクトファイル&ワークスペースと、2005用のプロジェクトファイル&ソリューションファイルを用意すれば両方の環境で開発を進めることができるでしょう。

但し、以下の点にご注意下さい。
・ソースファイルの追加や削除は両方のプロジェクトに対して行うこと。
・Visual C++6.0ではManaged C++が使えないのでManaged C++は使わないこと。
・MFCの仕様がだいぶ違うので、MFCも避けること。MFCを知り尽くしているのでしたらチャレンジはご自由に。
・C++コンパイラとしても若干仕様が違うので(for文内で定義された変数のスコープなど)、常に両方の環境でコンパイルできるか考えながら開発する必要があること。

QC言語で取得した文字列を、C++の文字列として取り扱いたいです。

C言語で取得した文字列を、C++の文字列として取り扱いたいです。

皆さんこんにちは。

C言語で取得したchar型で定義された文字列を、
C++の「std::string」に渡したいと思っております。
どうすればかなうでしょうか?
具体的には次のような内容です。

■C言語側
----
char key1 = "deperture";
----

■C++側で「key1 = key2」としたいです。
----
std::string key2 = key1;
----

C言語側で記述されている「key1」の値(deperture)を、
C++ソース内の「key2」に渡したいと思っています。

こうゆう場合、どんな方法をとれば適切でしょうか。
C言語側でのchar型の文字列の値を、
C++側の「std::string」型として
C++のソースへ渡す方法が分からないです。

アドバイスいただけるとありがたいです。
簡単な例を頂けると更に大変ありがたいです。

以上どうぞ宜しくお願い致します。

C言語で取得した文字列を、C++の文字列として取り扱いたいです。

皆さんこんにちは。

C言語で取得したchar型で定義された文字列を、
C++の「std::string」に渡したいと思っております。
どうすればかなうでしょうか?
具体的には次のような内容です。

■C言語側
----
char key1 = "deperture";
----

■C++側で「key1 = key2」としたいです。
----
std::string key2 = key1;
----

C言語側で記述されている「key1」の値(deperture)を、
C++ソース内の「key2」に渡したいと思っています。

...続きを読む

Aベストアンサー

> char key1 = "deperture";

本当にこれであっていますか?

char key1[] = "deperture";

ではないですか?
そうだとした場合、C++側では、

extern "C" char key1[];
std::string key2(key1);

とすればよいかと思います。

Qobjectiv-Cを学ぶにはC++を先に学ぶ必要があるか?

objectiv-Cを学ぶにはC++を先に学ぶ必要があるか?

最終的にobjective-cでiphone用のプログラムを作成したいと思っております。
調べているとobjective-cが必要であるが分かりました。
C++と似ていて否なるものというような表現が多いのですがC++を学んだあとに取り掛かるのが良いですか?それとも最初からobjective-cを学んだほうがよいですか?

要するにobjective-CはC++の上に成り立っているのか、Cから派生した、C++と同列の別言語なのか?
というあたりが知りたいところです。

当方のプログラミング言語の知識は
BASIC、FORTRANは使ったことがあります。
C言語は入門書「C言語入門 THE C Primer アスキー出版局」を読んだだけで、使ったことはありません。

よろしくお願いします。

Aベストアンサー

まったくの別物です。気にせず Objective-C を勉強すればよいでしょう。

QMFC C++ と C++/CLI の文字列

VS2008です。

Library: NativeC++ with MFC -> DLL
  ↑↓
Wrapper: C++/CLI with .NET -> DLL
  ↑↓
Appli: VB.NET with .NET -> EXE

元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。

Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上手く行きません。

Wrapper/Appli は System.CString で統一したいのですが、
Library ではどのような型として宣言すれば文字列のやり取りができるでしょうか。
( 引数・戻値の両者 )

CString wchar_t* char* System.String ALT::CStringT basic_string _bstr_t CComBSTR
LPCTSTR LPTSTR PCTSTR PTSTR LPCWSTR LPWSTR PCWSTR PWSTR BSTR…

なお、Library で下記のようにエクスポートし
__declspec(dllexport) BSTR test(LPCTSTR data);
wrapper で
BSTR hoge(LPCTSTR value){ return test(value); }
と宣言すると、wrapperのビルドで下記のエラーが表示されます。

エラー1error LNK2028: 未解決のトークン (0A000B39)
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper

エラー2error LNK2019: 未解決の外部シンボル
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper

エラー3fatal error LNK1120: 外部参照 2 が未解決です。

VS2008です。

Library: NativeC++ with MFC -> DLL
  ↑↓
Wrapper: C++/CLI with .NET -> DLL
  ↑↓
Appli: VB.NET with .NET -> EXE

元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。

Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上...続きを読む

Aベストアンサー

Library の DLL に対して
Dumpbin /exports XXXXX.dll
とするとどうなりますか?

QC++でコンテナを扱う際の質問です。

C++でコンテナを扱う際の質問です。

確保されるメモリ位置が最後まで保証されているコンテナは存在するのかを知りたいです。

Vectorは連続性が保障されていることから間違いなくアドレスは変わると思うのですが、Deque、Listなどはどうか知りたいです。

固定されているならアドレスをMapのkeyのように扱えるかも?などと考えた次第です。

Dequeだと削除しないかぎり変わらないよ!などといった条件がある場合はそれも教えていただけると尚嬉しいです。

よろしくお願いします

Aベストアンサー

コンテナなどは、連続性といっても見かけの連続性だけを保証するのが普通です。

その意味からは、物理的なアドレスが固定されているかどうかは断言できません。
そういうわけで、コンテナの場合は、ポインタ経由ではなくて、イテレータ経由でアクセスするわけです。

ただ、deque は、[] をサポートしているので、

std::deque<int> que;

に対して、 que[0], que[1] などは、期待通りの動作をするはずです。(未確認)
残念ながら、list は、[] をサポートしていませんので、同じ記述はできません。

もともと、配列のレベルであっても、連続性は厳密には、

・ &a[n] - &a[m] が、n - m に等しくなる
・ ptr = &a[n] のとき、*(ptr + m) は、a[n + m] をポイントする

ということであって、あからさまに、物理的なメモリのアドレスは出てこないですから。
なので、ポインタ同士の減算も、「両方のポインタが同じ配列にあるか、一度に malloc() された同じ領域をポイントしている場合」しか、保証されていなかったりします。

コンテナなどは、連続性といっても見かけの連続性だけを保証するのが普通です。

その意味からは、物理的なアドレスが固定されているかどうかは断言できません。
そういうわけで、コンテナの場合は、ポインタ経由ではなくて、イテレータ経由でアクセスするわけです。

ただ、deque は、[] をサポートしているので、

std::deque<int> que;

に対して、 que[0], que[1] などは、期待通りの動作をするはずです。(未確認)
残念ながら、list は、[] をサポートしていませんので、同じ記述はできません。

もともと、...続きを読む

Q[C++].csvファイルからキーワード検索

開発環境はLINUXのC++でVC++の特殊な関数は使えません。

ある.csvファイルやスペースで区切られたデータファイルを読み込んで
指定した列に特定のキーワードがあれば、同じ行の別の列データを返す
というような関数を作るのが目的です。

data.csv
1, aaa, xxx
2, bbb, yyy
3, ccc, zzz

find_keywords(bbb);
実行結果
xxx

条件として引数はstring型で渡す、関数はvoid型で結果は参照の上書き
とする必要があるのですが、だいたい以下のような流れで書きたいと思っています。
(条件を満たしていればこれに限りません)

void find_keywords(std::string words, std::string& result)
{
 while (ファイルの最後まで) {
  while (","を見つけるまで) {
   if (一致すれば) {
    result = 指定した列;
   }
  }
 }
}

main()
{
 std::string input;
 std::string result;

 std::cin >> input;
 find_keywords(input, result);
 std::cout << result;
}

inputを渡すときsegmentation errorとなってしまいます。
Cでchar*型で渡しているときはうまくいったのですが
何がいけないのでしょうか。

開発環境はLINUXのC++でVC++の特殊な関数は使えません。

ある.csvファイルやスペースで区切られたデータファイルを読み込んで
指定した列に特定のキーワードがあれば、同じ行の別の列データを返す
というような関数を作るのが目的です。

data.csv
1, aaa, xxx
2, bbb, yyy
3, ccc, zzz

find_keywords(bbb);
実行結果
xxx

条件として引数はstring型で渡す、関数はvoid型で結果は参照の上書き
とする必要があるのですが、だいたい以下のような流れで書きたいと思っています。
(条件を満たしていればこれに限...続きを読む

Aベストアンサー

printf は与えたものを「直ちに」出力するとは限らないので, それだけでは「find_keywords()を呼び出した瞬間にエラーになっている」とまでは言い切れません.

でちょっと試していただきたいのですが,
#include <string>
#include <cstdio>
#include <iostream>

using namespace std;

void find_keywords(string words)
{
printf("OK\n"); fflush(stdout);
cout << words << endl << flush;
}

int main()
{
string input;

cin >> input;
find_keywords(input);
cout << input << endl << flush;

return 0;
}
だとどうなるんでしょうか? これと printf のところを
cout << "OK\n" << flush;
に変えたものとを比較すると何かが見えてくるかもしれません.

printf は与えたものを「直ちに」出力するとは限らないので, それだけでは「find_keywords()を呼び出した瞬間にエラーになっている」とまでは言い切れません.

でちょっと試していただきたいのですが,
#include <string>
#include <cstdio>
#include <iostream>

using namespace std;

void find_keywords(string words)
{
printf("OK\n"); fflush(stdout);
cout << words << endl << flush;
}

int main()
{
string input;

cin >> input;
find_keywords(input);
cout << input << endl << flush;

return 0;
}
...続きを読む

QC/C++でアプリ開発

C/C++でアプリ開発

いまどきC++でアプリ開発なんてしないのででしょうか。
C/C++を使うのは組み込み分野とかぐらいなんでしょうか?
もし新卒の大学生がC/C++でアプリ開発するならどういう会社に入ればよいでしょうか?

Aベストアンサー

ソフトウェアハウスとかなら今でもC言語が必要になる案件は多いです
Windows向けソフトウェアの受託とか、Linuxアプリケーションとか。

ただ、C言語でそれなりの結果を出している
というわけでは無いのでしたら、
無理してC言語にこだわらない方がいいかもしれません。
Cで開発するだけの自信があるのでしたら、
それ以外の言語の仕事も十分に出来ますし、
そっちの方が仕事が捕まえやすいというのもあります。
それにC言語の仕様の多さは他の言語には類を見ないくらいに大きいですから、
他の言語の仕様を覚えてからでも、十分に役立たせることが出来る。

QC++で文字列の右端から特定の文字までの文字列を

C++で文字列の中から,文字列の右端から特定の文字までの文字列を取り出すというものを作りたいと思っています。

右端から○文字取り出す。といった感じのコードは書けるのですが、特定の文字まで、というのがどうもうまくいきません。こちら、良いアドバイスをいただける方がいましたらよろしくお願いします。

例:ファイル名を抽出
文字列\system32\notepad.exeからnotepad.exeの部分だけを取り出したい。というものです。
初めに見つけた\まで取り出す・・とやればよいのでしょうが、その方法が今ひとつ良くわからないので、どうかご助力お願いいたします。

Aベストアンサー

具体的なコードにもよりますが、

> 右端から○文字取り出す。といった感じのコードは書けるのですが

だったら、ほぼできていると思います。

char src[1000]; に文字列が入っているとして、

そのコードに、

int j = src[] にある、最後の文字を示すインデックス
for(int i = 0; i < ○; i++)
{
src[j] を取り出す;
j--;
}

という部分があるなら、

while(src[j] != '\\')

に書き直すだけ。

または、

for(int j = src[] にある、最後の文字を示すインデックス; (j >=0 ) && src[j] != '\\'; j--)

にするとか。

でも、「どうもうまくいきません」なら、「こういうことをしたら、こうなってしまいました」というのがあるほうが親切ですね。

QPHPのsubstr関数をC++とObjective-C++に置き換え

PHPのsubstr関数をC++とObjective-C++に置き換える方法

・PHP
$s = "abcdefg";
$t = substr($s, 3, 2);

というPHPのソースから C++と Objective-C++に変更したいのですが
どう記述すればよいのでしょうか?

・C++
char s[] = "abcdefg";
???


・Objective-C++ iOSは3.2です。
NSString *s = @"abcdefg";
???

Aベストアンサー

> strncpyは最後にNULLが付加されると思っていたのですが、

されませんよ(文字列がサイズより大きい場合)

> Objective-C++ではmemsetや敢えてNULLを付加しないと
> 文字列表示で、おかしく表示されます

Objective-C++ というものを知らないので、何とも言えません。

Q【C++】環境変数から取得したパスでINIファイルを読み込みたい

お世話になっております。
C++初心者です。

環境変数から取得したパスでINIファイルを読み込みたいのですが、
方法はありますでしょうか。

調べてみたところGetPrivateProfileStringという関数を使用すれば簡単にINIファイルを読み込めるみたいなのですが、
INIファイルパスを指定する引数の型がLPCTSTRのため、環境変数から取得したパスを渡せず、渡す方法もわからず困っています。

どなたかお知恵を貸していただければありがたいです。
おねがいします。

Aベストアンサー

>環境変数から取得したパスを渡せず

どのように取得していますか?

>INIファイルパスを指定する引数の型がLPCTSTRのため

『APIの内部処理で、受け取った文字列は書き換えませんよ。』
という意味でのLPCTSTR指定になっているだけですので、普通にLPTSTR型で渡しても問題ありません。


人気Q&Aランキング

おすすめ情報