2012-06-24 3 views
-1

У меня есть file.txt, содержащий некоторые переменные int. Мне нужно, чтобы преобразовать третью Grup чисел к Int array поэтому я могу манипулировать данными, как я хочу:Преобразование строки (char) в массив (int)

EX: file.txt 
============ 

111111 1001 20120131 30 
122222 2002 20110230 25 
133333 3003 20100325 12 
144444 1001 20110526 18 
155555 1001 20100524 25 
166666 2002 20120312 30 
177777 2003 20120428 28 
188888 3003 20111214 15 
199999 3002 20101113 27 
199999 1001 20101202 29 
133333 1001 20120715 25 
155555 1001 20100204 24 
177777 3003 20110102 30  

Мне нужно прочитать файл построчно и я выбрал функцию fscanf к этому:

FILE *fp; 

int n1, n2, n4; 
char n3[9]; 
int array[9] 

[...] 

while (fscanf (fp, "%d %d %s %d", &n1, &n2, n3, &n4); 

Теперь, когда у меня есть моя строка, как я могу преобразовать ее в массив int? Я попытался с:

for (i = 0; i < strlen(n3); i++) 
    array[i] = atoi(strlen[i]) 

но это идет не так ... как я могу решить эту проблему?

возвращается ко мне:

warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast [enabled by default] 
/usr/include/stdlib.h:148:12: note: expected ‘const char *’ but argument is of type ‘char’ 
+1

Что означает 'strlen [i]'? 'strlen' - это функция, а не массив. –

+0

strlen остается на длину строки n3 – Lc0rE

+0

Стоит отметить, что «цифры» в третьем столбце выглядят так, будто они, вероятно, являются датами (формируются как YYYYMMDD), а не цифрами. Но я полагаю, вы можете обрабатывать их как ints, если хотите. (Например., обрабатывая их как ints, имеет смысл, если вы просто хотите сортировать по дате) –

ответ

2

Вам нужно что-то вроде:

int array[HUGE]; 

for (int i = 0; i < HUGE && fscanf(fp, "%d %d %s %d", &n1, &n2, n3, &n4) == 4; ++i) 
{ 
    array[i] = atoi(n3); 
} 

Основная проблема в том, если вы не знаете, сколько строк в вашем файле, то вы не знайте, как большой размер вашего массива получателей. Более безопасным решением было бы использовать динамический массив с malloc и realloc.

На этой ноте, читая строку в char[9] является Алсу очень опасно: Если файл содержит неверные данные, ваша программа умирает, или хуже. Было бы безопаснее все время читать файл по строкам в строку, используя fgets, а затем маркер и разбор каждой строки отдельно, например. используя strtoul.

+0

warning: передающий аргумент 1 из 'atoi' делает указатель из целого без литого [включен по умолчанию] /usr/include/stdlib.h:148 : 12: note: expected 'const char *', но аргумент имеет тип 'char' – Lc0rE

+0

@l_core: Я внес некоторые изменения. Чем больше я смотрю на это, тем меньше мне нравится ваш подход. Вместо этого используйте 'fgets' и' strtoul'. –

1

По крайней мере, так как я понимаю ваш вопрос, вы действительно заботитесь только о числах в третьей колонке. Если предположить, что это так, я думаю, что я хотел бы сделать что-то больше, как это:

for (i=0; i<elements(array); i++) 
    if (0 == fscanf(infile, "%*d %*d %d %*d", array+i)) 
     break; 
+0

Должны ли я поставить это «для»? в или из fscanf? – Lc0rE

+0

@l_core: Этот цикл 'for' включает в себя scanf в своем теле. Это будет читать весь файл (или столько строк, сколько у вас есть в вашем массиве), помещая числа из третьего столбца в массив и игнорируя остальные три числа в каждой строке. –

1

Если вы действительно просто хотите третий элемент в виде целого числа, то почему бы не читать его как целое, чтобы начать с время вызова to fscanf? То есть, я думаю, что следующий будет делать примерно то, что вы хотите:

#define MAX_VALUES 9 

FILE *fp; 

int n1, n2, n3, n4; 
int array[MAX_VALUES] 
int num_values; 

while (fscanf (fp, "%d %d %d %d", &n1, &n2, &n3, &n4) && (num_values<MAX_VALUES)) 
    array[num_values++] = n3; 
0

Если вы хотите массив из 8 однозначных цифр для каждой строки, то вы могли бы сделать что-то вроде этого:

for (i = 0; i < 8; i++) { 
    array[i] = n3[i] - '0'; 
} 

Однако, как говорили другие, не стоит полагаться на формат файла для длины n3 [] и массива [], хотя я сделал то же самое при замене strlen() на 8.

I 'd возможно strtok() каждая строка, используя пробел в качестве разделителя, затем выполните некоторую проверку данных, чтобы сделать уверен, что это то, что вы думаете.

P.S. Третий столбец выглядит как дата, вы уверены, что хотите массив int?