0

ファイル名が手動でプログラムに入力され、サイズ 9 の配列として定義されている、かなり単純なコードが以下に添付されています。この例では正しいです。ファイルの名前は、簡潔にするためにここには含まれていない関数に渡されます。この関数は、ファイルを 5 つのベクトル文字列としてデータを読み込んで開き、それらをメイン プログラムにフィードバックして、ポインター演算によってアクセスできるようにします。このケースで述べたように、プログラムは動作しますが、File1 のサイズを 9 から 8 に変更すると動作しません。これは、ヌル ターミネータが考慮されていないためです。これをより安全なプログラムにするという精神で、文字列のサイズに null ターミネータが含まれていない場合に条件を認識し、関数呼び出しとそれに関連するすべてのコード行をスキップするようにプログラムに求めています。でも、null ターミネータが含まれていない場合、コードはエラーを生成しないため、このインスタンスで例外処理を使用する方法がわかりません。任意の考えをいただければ幸いです。

#include <vector>
#include <iostream>
#include <fstream>

#include "Read_Columnar_File.h"

int main(int argc, const char * argv[]) {
    std::vector<std::string> str3;
    std::vector<int> str4;
    std::vector<char> str5;
    std::vector<int> str6;

    unsigned long size_Misc;
    float Peak_Misc_Value;
    std::vector<float> MISC_DATA; // Reads in Misc. spending data
    char File1[9];
    strcpy(File1, "Misc.txt");
    Read_Five_Columns(File1,MISC_DATA,str3,str4,str5,str6);
    str3.clear(); str4.clear(); str5.clear(); str6.clear();
    size_Misc = MISC_DATA.size();
    auto max_Misc = std::max_element(MISC_DATA.begin(), MISC_DATA.end());
    Peak_Misc_Value = *max_Misc;
}
4

1 に答える 1

2

ファイル名のコンテナとして std::string を使用することを検討してください。次に、 File1.c_str() は常に null で終了する文字列にする必要があります。

質問に書いたことを本当にやりたい場合は、File1 配列をループし、各文字が '\0' であるかどうかを確認すると、文字列が null で終了しているかどうかがわかります。ただし、配列の範囲外に書き込む可能性があるため、そのように strcpy を使用することはお勧めしません。

于 2014-11-15T20:24:47.903 に答える