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);

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

QCかC++どちらを覚えるべきですか?

初めまして。せいじと申します。よろしくお願いします。
プログラミング経験なしです。今30歳です。
遅すぎますが、これからC言語かC++言語をマスターしたいと思っています。
Windows 98 + Borland C++ Compiler 5.5
で勉強しようと思ってます。

Cの拡張されたものがC++だからC++を覚えようと思って、C++の本を買いました。
・新C++言語入門 ビギナー編 SOFTBANK Publishing 林 晴比古 著
・詳説C++             SOFTBANK Publishing 大城 正典 著
2冊ともまだ最初の方を読んで実践しただけです。

クラス、オブジェクト指向プログラミング等々が何なのか分かっていないのに、
C++をする意味があるのか、まずはCで十分ではないのか?
と思うようになってきました。

実際どうしたら良いのでしょう。
何も知らないならC++からでも良いのでしょうか。
違いが分からないならCで十分なのでしょうか。
みなさんの意見を聞かせてください。

よろしくお願いします。

初めまして。せいじと申します。よろしくお願いします。
プログラミング経験なしです。今30歳です。
遅すぎますが、これからC言語かC++言語をマスターしたいと思っています。
Windows 98 + Borland C++ Compiler 5.5
で勉強しようと思ってます。

Cの拡張されたものがC++だからC++を覚えようと思って、C++の本を買いました。
・新C++言語入門 ビギナー編 SOFTBANK Publishing 林 晴比古 著
・詳説C++             SOFTBANK Publishing 大城 正典 著
2冊ともまだ最初の方を読んで実...続きを読む

Aベストアンサー

seiji-h さん。こんにちわ。
プログラミングを今後主に何の目的で使いますか?

(1)仕事でC++が必要。
 頑張っておぼえましょう。

(2)文書データの加工など。。。
 今すぐPerl言語に切り替えましょう。

(3)趣味でWindowsアプリなどの作成を目指して。。
 そのままコツコツC++を続けていってください。

(4)歯ごたえのあるプログラミング言語を。。。
 そのままコツコツC++を続けていってください。

>実際どうしたら良いのでしょう。
>何も知らないならC++からでも良いのでしょうか。
どのようなことに興味をおぼえるかで、Cから始めるべきか、C++から始めるべきか
向き不向きがあります。

★簡潔な文法をもとに、ガリガリと自分の思うままに、プログラミングしたい。
とにかく自分で動くものを作りたいということなら、Cから始めるのが向いていると思われます。
★プログラミングすることよりも、プログラミング言語「自体」に興味があって、
一種の研究の対象と考えている場合は、C++の方が、おもしろおかしく学べると思います。

seiji-h さん。こんにちわ。
プログラミングを今後主に何の目的で使いますか?

(1)仕事でC++が必要。
 頑張っておぼえましょう。

(2)文書データの加工など。。。
 今すぐPerl言語に切り替えましょう。

(3)趣味でWindowsアプリなどの作成を目指して。。
 そのままコツコツC++を続けていってください。

(4)歯ごたえのあるプログラミング言語を。。。
 そのままコツコツC++を続けていってください。

>実際どうしたら良いのでしょう。
>何も知らないなら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
とするとどうなりますか?

QVisual C++を使用するには,C++の知識は必要?

Visual C++ を使用する必要が生じたのですが,C言語の知識しかなく,
VC++を使用するにあたり,新たにC++を勉強しなければならないか分かりません。
C++を勉強してから,VC++を勉強し始めるべきなのでしょうか?
また,もしC++の勉強をしなければならない場合,使用する参考書として「独習C++」を考えているのですが,この参考書で事足りるでしょうか?
回答よろしくお願いします。

Aベストアンサー

ANo.1の方に同感です。

私はMS-DOSでのC言語からVC++へジャンプしました。

VC++を理解するということは
 1.C++という言語
 2.windowsOS,API
 3.MFC
を理解するということです。

私のとっかかりの本は、3冊のシリーズで
 1.Windowsプログラミングについて
 2.C++について
 3.MFCについて(だった思う)
に分かれており、C言語の知識とwindowsのアプリを触った経験があれば順を追って素直に理解できるものでした。
#処分してしまったので正しい書籍名はわかりませんが、クリーム色のカバーでした。

ただ、これはあくまで入門書で、その後C++に関する本、MFCに関する本、WIN32APIに関する何冊か読まないと、やはり仕事はできません。

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--)

にするとか。

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

QC++を学習するにあたって

質問は以下の3つですよろしくお願いします

1.vc++ と c++の違いを教えてください。
 vc++は開発環境でc++の画面をプログラミングするときに使うもの
 という認識でいいでしょうか。
2.vc++とc++の開発環境を教えてください。
javaでいうeclipsの様なものまたその開発環境はcやc++やc#でも使えるか否か

3.vc++ や c++ は制御系システムで用い業務系システムでは
 利用しないのでしょうか
 
初歩的な質問で申し訳けありませんがよろしくお願いします。

Aベストアンサー

1.「VC++」とは、マイクロソフト社の「Visual C++」という製品を略したものです。「C++」だけの場合は製品名ではなく、プログラミング言語名です。別に画面特定ではないです。

2.Windows上で一番メジャーな開発環境はマイクロソフト社の「Visual Studio」ですかね。C、C++、C#すべて使えます。
「Visual C++」はVisual Studioの一部です。

3.もちろん業務系でも使われます。アプリケーションやゲームの製作にも一番使われているのではないでしょうか。

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

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

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

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

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

Aベストアンサー

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

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

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

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


人気Q&Aランキング