質問させていただきます。こちらの過去スレッドなども含めて検索したのですが解決しなかったので新しくトピックを建てさせていただきました。次のような.txtファイルがあったとします。4-15○×○○×××それぞれのデータにおいて例えば×の数を数えて以下のように.csvに出力するとします。34-22,54-15,4.txtには、全部で5000個近くのデータがあるものとし、以下のようなプログラムをVC++2010EEにて組みました。);}単純に、1行ずつ読み取って奇数行なら名前を取得、偶数行なら配列を取得して×の数を数えているだけです。読み込み中にアクセス違反が発生しました。いうエラーがfgets()に関して起こりました。本来であれば6777-33というデータが出力されなければいけないのにも関わらず、67までしか出力されていないのです。その行だけ文字数が異常に多いとかそんなことはなく、4450行まででいったん区切り、4451行目以降を別に走らせると少なくとも4451行目は無事通過しますが、今度は51行目ぐらい(本来なら4501行目ぐらい)で同様の現象が起こります。ひとつで1byteという前提でプログラムを組んでいませんか?文字コードにもよりますが、○や×は1文字あたり2byteか3byteです。今回の例は適当な例で、実際のものとはデータの内容が少し異なります。○×に関しては、実際のデータは半角の英数字であり、1Byteという前提でプログラムを組んでいます。○×じゃなくてABにしておけばよかったですね。);と書くといいと思います。5年前みけCAT様ありがとうございます。そのような方法があるとは知りませんでした。4.8.1でコンパイルして適当なケースで実行しましたが、エラーは起きませんでした。問題が再現する入力ファイルをアップロードして下さい。入力ファイルを見ないとなんとも言えませんが、fgetsの使い方にやや疑問があるので書いておきます。fgetsは「改行を削除しない」ので、入力行が「改行を含めて」64byte(NULを含めて65byte)までである事を確認して下さい。Dustが32までだとしたら、最も多く見積もって32*4+16+4ほどの文字が来る可能性があるのではないのですか?fgetsは行の終端(改行)になるか、指定した長さまで読み込んだ分だけのどちらかを読み込みます。どこかで行の終端まで読み込んでいない場合、Totalの数が一致しません。(トータルが行数を表しているのであれば)Totalをインクリメントする場合は、必ず改行文字が含まれているかを判定して行うべきです。4-15のような行をデータ列として読み込んでしまっている気がします。fgetsでアクセス違反が起きるかは知りませんけど。6777-33だとして、67はちょうど28~29byte目あたりですね。4行のデータを提示してください。次のプログラムの実行結果を教えてください。固定サイズのバッファにscanf系を使用して文字列を入れる場合、ちゃんと長さを指定しましょう。バッファオーバーランを防げないなんかしら文字数を超えてるものがあるとしか思えませんよ。5年前みけCAT様VC++2010EEを再インストールしてみてもやはりだめでした新ゝ月様ファイルは以下のオンラインストレージにアップしました。3日間の有効期限をかけてありますのであらかじめご了承ください。http://xfs.jp/WiDAtfプログラムの一部が異なり、ファイル名と○×判定が実際にはそれぞれData⇒miRNA、×⇒Gとなります。配列自体は余裕をもった長さにしてありますので、大丈夫だと思います。新ゝ月様宛のところに実データをアップしてありますので上記のリンクからお願いします。書いていただいたプログラムは現在動かせる環境にないので出来るようになり次第やってみます。っくす様あとでリンク先を読ませていただきます(さらっと見ただけでは完全に理解できなかったので)が、例の通り文字数がデータによって異なるので長さを指定するのは難しいかもしれません。4でソースコードを改変せずに実行しましたが、アクセス違反は発生せず、miR-6777-5p,12、miR-6777-3p,3も正常に出力されました。5年前4450行までは問題ありませんが4998行目「UAGAUCUUUGACUCUGGCAGUCUCCAGG」が28文字ありますので少なくともMainArrayのサイズでは足りません。様ありがとうございます。いざとなったらやっていただいたデータを使わせていただきます。なんで自分のではだめなんでしょうか・・・・・・can110様ありがとうございます。25個ぐらいが最高だと思っていたので、28個あるのは想定外でした。うまくいかないのが4451行目なのでそこが原因というわけではたぶんないですよね。MainArrayは32に直しておきます。プログラムの一部が異なり、ファイル名と○×判定が実際にはそれぞれData⇒miRNA、×⇒Gとなります。4行のデータを提示してください。次のプログラムの実行結果を教えてください。0;}こちらですが、何も表示されずにコンソールアプリケーションが終了しました。アクセス違反になりました。&lf);コード:ma=000E0C2028=000E0C3Clf=000E0C3Cと表示されます。壊れてしまうので、入力処理ができなくなっています。5年前No.14で何も表示されずに、とありますが、1で終了していませんか。txtファイル名を適切に変えて実行しましたか。ありがとうございます。25個ぐらいが最高だと思っていたので、28個あるのは想定外でした。うまくいかないのが4451行目なのでそこが原因というわけではたぶんないですよね。入力データの仕様をはっきり理解していない。曖昧な判断で処理をすることが既に問題だと思います。長さが不定でわからないなら動的に領域を確保するべき。4451行目が不正に出力される事と、コードの問題は直接でなくとも無関係ではありません。32にするという場当たり的対応をするにしても、関係ないと決めつける前に、実行結果を報告してください。「たぶんないですよね」などという実行結果も伴わない憶測ばかりではいつまでも解決しません。2010だとアクセス違反になり、2013だとアクセス違反にならないのかはちょっとわかりません。2010を持っていないので。ありがとうございます。25個ぐらいが最高だと思っていたので、28個あるのは想定外でした。うまくいかないのが4451行目なのでそこが原因というわけではたぶんないですよね。推測しないでちゃんと思った通りに動くのか、結果を見て判断してください。プログラムは思った通りに動くのではなく、書いた通りに動くのです。そこを分かっていないから、「そこが原因というわけではたぶんないですよね。」という言葉が出るんでしょうね。4450行までは問題ありませんが4998行目「UAGAUCUUUGACUCUGGCAGUCUCCAGG」が28文字ありますので少なくともMainArrayのサイズでは足りません。実際のコードと提示されているコードに違いがあるような気もしますが...が関係していると思われます。本来であれば6777-33というデータが出力されなければいけないのにも関わらず、67までしか出力されていないのです。No.14で何も表示されずに、とありますが、1で終了していませんか。txtファイル名を適切に変えて実行しましたか。0にブレイクポイントを置いて確認してみましたがやはり何も表示されませんでした。入力データの仕様をはっきり理解していない。曖昧な判断で処理をすることが既に問題だと思います。長さが不定でわからないなら動的に領域を確保するべき。4451行目が不正に出力される事と、コードの問題は直接でなくとも無関係ではありません。32にするという場当たり的対応をするにしても、関係ないと決めつける前に、実行結果を報告してください。「たぶんないですよね」などという実行結果も伴わない憶測ばかりではいつまでも解決しません。はへにっくす様からも同様のご指摘がありましたのでまとめてお返事させていただきますと弁解にしかなりませんが、(このWikiのページに書かれている情報は古く、間違っているところも多々ありますが)Wikiのようにほとんどの論文で長さが20~25ほどと書かれていますので28にしました。どれも同じような長さの配列なので少し多めに見積もっておけばわざわざ動的配列にする必要はないと考えたのです。書いたとおりに動くからこそ、実際に動かないところよりも500行近く先のことは一先ずは関係ないと考えていました。0にブレイクポイントを置いて確認してみましたがやはり何も表示されませんでした。表示はされないものの、nの値は5157、bufの値はCCUGGGGACAGGGGAUUGGGGCAG(最後の行)となっていますふむ。表示しないようにしたんだと思います。表示されなかったということは、私が最初に危惧していた、「行の終端まで読み込んでいない」訳ではないという事です。同時に、ファイルを行単位で読み込んだだけではアクセス違反が起きないということですから、sscanfやmainArrayの辺りが原因である可能性が高いです。弁解にしかなりませんが、(このWikiのページに書かれている情報は古く、間違っているところも多々ありますが)Wikiのようにほとんどの論文で長さが20~25ほどと書かれていますので28にしました。どれも同じような長さの配列なので少し多めに見積もっておけばわざわざ動的配列にする必要はないと考えたのです。それで、肝心の実行結果が書かれていないように見受けられます。32に訂正して、実行結果は変わりましたか。肝心の実行結果が書かれていないように見受けられます。32に訂正して、実行結果は変わりましたか。書くのを忘れていました。32に変更しても結果は変わりませんでした。5年前...全く変わらなかったのですか?念のため、その訂正したソースコードと、visualstudioの出力ウィンドウをコピーして載せてもらえませんか。変わらないとなると...どういう事なんですかね。動かないにせよ何かしら変化はあると思ったんですが。5年前あとでリンク先を読ませていただきます(さらっと見ただけでは完全に理解できなかったので)が、例の通り文字数がデータによって異なるので長さを指定するのは難しいかもしれません。見落としていましたが、これは違います。sscanfで%sの間に指定しろと書いてあるのはバッファーサイズであって、入力サイズではありません。28なら27を、32なら31を書けばいいのです。こちらも試してみてください。32に訂正する際に、memsetも修正するのを忘れないで下さい。オフトピックmemsetが悪さしてる...訳ではない?2010と2013で動作が違う理由を少し考えてみましたが、やはり未定義動作に起因している気がします。内容は、2225行目が「miR-6777-5p,12」、2226行目が「miR-67」です。4452行読み込んだと考えて、そこで落ちたと考えたんですね。それは大きな間違いです。実行しても、それがその時点でファイルに書き込まれるわけではありません。大きさのバッファにため込まれるのです。実際にファイルに出力されます。