У меня есть довольно простой код, прикрепленный ниже, где имя файла вводится вручную в программу и определяется как массив размера 9, что правильно в этом примере. Имя файла передается функции, которая здесь не включена для краткости. Функция открывает файл для чтения в данных в виде пяти векторных строк и возвращает их в основную программу, где к ним можно получить доступ с помощью арифметики указателей. Как я уже упоминал в этом случае, программа работает, но если я изменю размер File1 с 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;
}
Попробуйте использовать std :: string в качестве контейнера для имени вашего файла. Тогда File1.c_str () всегда должен быть строкой с нулевым символом в конце.
Если вы действительно хотите сделать то, что вы пишете в вопросе, циклически перебирая массив File1 и проверяя, является ли каждый символ ‘\ 0’, вам сообщат, завершена ли строка нулем. Я бы не советовал использовать strcpy таким образом, поскольку он может записывать за пределы вашего массива.