mrby123 Ответов: 1

Я-примитивный код 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, то есть хороший шанс, что вы их получите.

Как сказал Ричард, лучше всего использовать отладчик и посмотреть, что происходит.

1 Ответов

Рейтинг:
5

Patrice T

Подсказка: вместо того чтобы зацикливаться на входном файле и считывать строки и хранить значения, а затем зацикливаться на выходном файле, вы можете объединить оба цикла и избежать использования векторов.

loop
  read 1 line from input file
  decode/store values to variables
  write 1 line to output file
end of loop

Не загружайте файл в векторы, если у вас нет других причин, кроме как потому, что это возможно. Он не получает никакого преимущества и использует огромную память.
Цитата:
Я попытался запустить его, но он не может записать файл.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


CPallini

5.

Patrice T

Спасибо