Я пытаюсь проанализировать некоторые файлы журнала CSV, извлекая только поле n'th (отклонение других для скорости). Моя функция работает так, как ожидалось, когда я использую размер буфера с размером fread больше, чем размер ввода.Проблемы с «сохранением прогресса» функции
Проблема заключается в том, что я читаю часть ввода и пытаюсь продолжить, когда я остановился в следующий раз, когда вызывается функция. Я считаю, что проблема заключается в том, как я обрабатываю нулевой ограничитель и устанавливаю свои глобальные переменные, но я просто не могу понять это.
Любая помощь в понимании того, что я делаю неправильно, очень ценится!
код
#include <stdio.h>
#include <time.h>
int gcomc = 0;
int gpos = 0;
void test(char *str, int len)
{
const char *ptr = str;
char ch;
int i;
char so[10];
int comc = gcomc;
int pos = gpos;
for(i = 0; i < len; i++)
{
ch = ptr[i];
switch(ch)
{
case ';':
comc++;
break;
case '\0':
gcomc = comc;
gpos = pos;
break;
default:
if (comc == 3) {
ch = ptr[i];
so[pos++] = ch;
}
if (comc == 7) {
printf(" %s ", so);
comc = 0;
pos = 0;
gcomc = 0;
gpos = 0;
}
}
}
return;
}
int main(int argc, char* argv[])
{
FILE *fin=fopen("test.txt", "rb");
char buffer[100 + 1];
size_t bsz;
while((bsz = fread(buffer, sizeof *buffer, 100, fin)) > 0)
{
buffer[bsz] = '\0';
test(buffer, bsz);
}
return 1;
}
Входной
A;B;C;D;E;F;G;H
I;J;K;L;M;N;O;P
Q;R;S;T;U;V;W;X
Y;Z;1;2;3;4;5;6
Вывод с размером буфера 100 (101)
D L T 2
Выход с размером буфера 10 (11)
D P
Q X
Segmentation fault (core dumped)
Edit: Спасибо за комментарии и код, я переработал мой (довольно тупой письменный) код - дальше критика приветствуется (конструктивная или деструктивная, я узнал от всего этого):
#include <stdio.h>
#include <time.h>
void test(char *str, int len);
int gcomc, gpos = 0;
void test(char *str, int len)
{
const char *ptr = str;
char ch;
int i;
static char so[10];
for(i = 0; i < len; i++)
{
ch = ptr[i];
switch(ch)
{
case ';':
gcomc++;
break;
default:
if (gcomc == 3) {
ch = ptr[i];
so[gpos++] = ch;
}
if (gcomc == 7) {
so[gpos] = '\0'; /* ensure so is null terminated */
printf(" %s ", so);
gcomc = 0;
gpos = 0;
}
}
}
return;
}
extern int main()
{
FILE *fin=fopen("test.txt", "rb");
char buffer[10 + 1];
size_t bsz;
while((bsz = fread(buffer, sizeof *buffer, sizeof buffer, fin)) > 0)
{
test(buffer, bsz);
}
return 1;
}
Почему вы даже копируете глобальные таблицы для местных жителей и наоборот? Почему бы не использовать глобальные переменные напрямую, если функция мутирует состояние (что обычно не является лучшей идеей). Кроме того, кажется, что 'so' также должен быть глобальным (что, если вы читаете в середине токена)? – Lou
Я бы сказал, что этот случай 'case '\ 0':' никогда не произойдет. – alk
Невозможно воспроизвести UB с показанным кодом. – alk