2014-11-15 11 views
0

У меня есть довольно простой код, приведенный ниже, где имя файла вводится вручную в программу и определяется как массив размером 9, что является правильным в этом пример. Имя файла передается функции, которая не включена здесь для краткости. Функция откроет файл в считанных данных как пять векторных строк и вернет их в основную программу, к которой к ним можно получить доступ с помощью арифметики указателя. Как я уже упоминал в этом случае, программа работает, но если я изменю размер файла 1 с 9 по 8, это не сработает, потому что нулевой ограничитель не учитывается. В духе того, чтобы сделать эту более безопасную программу, я хотел бы, чтобы программа распознавала условия, когда размер строки не включает нулевой ограничитель и пропускает вызов функции и все связанные с ней строки кода. Однако, когда нулевой терминатор не включен, код не вызывает ошибки, поэтому я не уверен, как использовать обработку исключений в этом экземпляре. Любые мысли были бы оценены.Как поймать ошибку с символьной строкой, не содержащей нулевой ограничитель

#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; 
} 
+1

В этой * программе, в духе избежания ошибок, вы должны написать 'char File1 [] =" Misc.txt ";' – hobbs

ответ

2

Рассмотрите возможность использования std :: string в качестве контейнера для имени вашего файла. Тогда File1.c_str() всегда должен иметь строку с нулевым завершением.

Если вы действительно хотите сделать то, что вы пишете в цикле вопросов через массив File1, и проверить, является ли каждый символ «\ 0», если вы хотите, чтобы жало не было завершено. Я бы не рекомендовал использовать такой тип strcpy, поскольку он может выписывать границы вашего массива.

+0

Это очень хорошее предложение, я все еще нахожусь в изучении возможностей стандартную библиотеку шаблонов и не понимали, что в stl существует строковая возможность. Спасибо. – Jon