Я-примитивный код C++, пожалуйста, помогите моим сегментам кода
Я очень примитивный программист на c++. Для вашего сведения, вот сегменты кода для чтения csv-файла excel.
// FILE *f_ptr6; FILE *f_ptr7; // std::vector<string> xcord(1100000); std::vector<string> ycord(1100000); std::vector<string> zcord(1100000); std::vector<string> dsty(1100000); std::vector<string> ucs(1100000); // if((err=fopen_s(&f_ptr6,"dc_data.csv","r")) !=0 ) printf( "The file 'dc_data.csv' was not opened\n" ); else printf( "The file 'dc_data.csv' was opened\n" ); // if((err=fopen_s(&f_ptr7,"dc_data_out.txt","w+")) !=0 ) printf( "The file 'dc_data_out.txt' was not opened\n" ); else printf( "The file 'dc_data_out.txt' was opened\n" ); // char string1[91]=" "; char *next_token1=NULL; char seps1[] = " ,\t\n"; int i=0; while(fgets(string1, sizeof(string1), f_ptr6)!=NULL && !feof(f_ptr6)) { xcord[i] = strtok_s(string1, seps,&next_token); ycord[i] = strtok_s(NULL, seps,&next_token); zcord[i] = strtok_s(NULL, seps,&next_token); dsty[i] = strtok_s(NULL, seps,&next_token); ucs[i] = strtok_s(NULL, seps,&next_token); i=i+1; } fclose(f_ptr6); // // just write out part of the file // for (int j=0; j<500;j++) { fprintf (f_ptr7, "%s %s %s %s %s\n", xcord[j], ycord[j], zcord[j], dsty[j], ucs[j]); } fclose( f_ptr7);Если у вас есть время, пожалуйста, посмотрите. CSV-файл excel состоит из пяти столбцов, и первая строка-это заголовок для каждого столбца.
Что я уже пробовал:
Я попытался запустить его, но он не может записать файл.
Richard MacCutchan
Используйте отладчик, чтобы увидеть, какие данные считываются и какие записываются.
Rick York
Я удивлен, что это даже компилируется. Я всегда использую WL 4, и это определенно не будет. Когда вы передаете строку std::переменной функции, вам нужно вызвать ее метод c_str ().
Почему у вас есть вектор из 1,1 млн строк, объявленных, когда вы ожидаете 500 строк в вашем файле?
Вы уверены, что ваш .CSV-файл хорошо сформирован? Я спрашиваю потому, что если у вас есть пустая запись, которая представляет собой две соседние запятые (,,), то strtok пропустит их оба и обнулит их. Вы получите нули от вызовов, когда у него закончатся токены. По этой причине я думаю, что strspn-это лучшая функция для использования для этого, потому что она не обнуляет найденные разделители. Он возвращает индекс к первому из них. Учитывая этот индекс, вы можете обнулить их самостоятельно после того, как изучите их, и это позволяет правильно обрабатывать пустые поля, если они есть в вашем файле(файлах). Если вы обрабатываете выходные данные из Excel, то есть хороший шанс, что вы их получите.
Как сказал Ричард, лучше всего использовать отладчик и посмотреть, что происходит.