2016-07-07 6 views
0

У меня есть один класс CSVReader, который имеет эту функциюПочему значения вектора Utf8Char меняются?

vector<UtfChar*> CSVFile::ReadFile(FILE* fp) 
{ 
    //int count = 0; 
    Utf8Char buff[256]; 

    fgets(buff, 256, (FILE*)fp); 
     // count++; 

    Utf8Char *token = strtok(buff, ","); 
    bvector<UtfChar*> localVec; 
    while (token != NULL) 
    { 
     localVec.push_back(token); 
     token = strtok(NULL, ","); 
    } 
    return localVec; 
} 

Теперь у меня есть еще один класс, от которого я называю эту функцию:

FILE *fp; 
fp = fopen("SampleFile.csv", "r"); 
while((getc(fp)) != EOF) 
{ 
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp); 
} 

Здесь я сравниваю значение localVec с некоторым набором значений (char*) У меня есть. Но в этом другом классе, когда я пытаюсь получить доступ к вектору, например, localVec[0] или l ocalVec[1], он дает мусор. Я пробовал сравнивать с самим классом CSVReader, а затем работал там. Но мне нужно сделать сравнение в другом классе, так что я могу использовать тот же класс CSVReader для других файлов CSV.

+3

Указатели и функции C. Что может пойти не так? Это потому, что вы используете один буфер, все векторные элементы ссылаются на него, а затем он уничтожается. Пожалуйста, используйте стандартную библиотеку C++. – LogicStuff

+0

Что это за «мусор»? Как определяется Utf8Char? – user3684240

+0

@LogicStuff Если программист не может узнать область локальных переменных и как обращаться с простыми указателями, использование стандартной библиотеки C++ не поможет. –

ответ

2

Проблема в том, что у вас есть оборванные указатели. Вы можете создать и заполнить локальный массив с

Utf8Char buff[256]; 

fgets(buff, 256, (FILE*)fp); 

Тогда вы получите ссылки на различные сегменты этого буфера с

Utf8Char *token = strtok(buff, ","); 
bvector<UtfChar*> localVec; 
while (token != NULL) 
{ 
    localVec.push_back(token); 
    token = strtok(NULL, ","); 
} 

Так что теперь у вас есть вектор полного указателей на каждый сегмент локального буфера , После того, как вы вернете вектор из функции, локальный буфер будет уничтожен. Это означает, что все указатели, которые у вас есть, теперь указывают на то, что вы больше не владеете. Использование этих указателей является неопределенным поведением и является причиной, по которой вы получаете выход мусора.

Также обратите внимание, что вы можете избежать всех этих C-ism, если вы используете How can I read and parse CSV files in C++? для разбора CSV-файла.

+0

Спасибо Nathan :) – Logan0486

1

Этот код

bvector<UtfChar*> localVec; 

означает, что вы храните указатели в вашем векторе.

Эти указатели указывают на локальную переменную, которая выходит из сферы действия, когда возвращается ваша функция.

0

Похоже, что вы пропустите первый символ в каждой строке прочитанный из файла:

while((getc(fp)) != EOF){ 
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp); 
} 

ли это намеренно? Если это так, то здесь возникает проблема: символы UTF-8 могут иметь переменную длину (например, некоторые из них представлены 1 байт, другие с 2 байтами и т. Д., До 6 байтов). Если вы не производите никакого преобразования строк, вы можете скопировать строки байта UTF-8 по байтам из одного места в другое и не беспокоиться о длинах символов, потому что строка останется действительной. Но если вы отключите первый байт от строки, то он перестанет быть допустимой строкой UTF-8 и не может быть интерпретирован как она.

+0

Нет, это не намеренно. Как этого избежать .. спасибо BTW – Logan0486

Смежные вопросы