2014-01-30 2 views
0

Я пытаюсь прочитать временный файл, состоящий из нескольких строк, например, следующего примера. Линии НЕ отсортированы.Чтение CSV в массив для сортировки по номерам, указанным в строках

3;NOK 
2;OK 
1;NA 

Для облегчения вывода-функции, в которой я хочу предложить несколько возможностей выхода (CSV, Печать на экране ...), я думал, что это было бы умным, чтобы сделать следующее.

  1. Открыть файл
  2. Итерации по линиям
  3. Extract числа в начале
  4. Используйте это в качестве индекса массива
  5. Результат должен быть «отсортированным» массив

Минимальный пример, который дает мне ошибку сегментации.

#include <stdlib.h> 
#include <stdio.h> 

int main (int argc, char *argv[]){ 
FILE *outfp = fopen("test.txt", "r"); 
if (outfp == NULL){ 
printf("There was a problem: Temporary output-file could not be opened"); 
return 1; 
} 
// OUTPUT HANDLING 
char output_line[1024]; 
char output_cut[1024]; 
int line_number; 
char *output_array[3]; //The maximum number of possible entries is fixed 

// I got variables for the line, for the linenumber and output_cut is needed for sscanf 
while(fgets(output_line, sizeof(output_line), outfp)!=NULL){ 
sscanf(output_line,"%d;%s",&line_number,output_cut); 
output_array[line_number]=output_line; 
} 
printf("LINE1:%s",output_array[1]); 
printf("LINE2:%s",output_array[2]); 
printf("LINE3:%s",output_array[3]); 
return 0; 
} 

Мой первый вопрос: есть ли это правильный способ сделать, или другие более эффективные способы «своего рода» этот тип файла в легкий путь для гибкого производства? Если да, то почему это не работает?

С уважением Маркус

Edit: пример текстовый файл содержит только цифры от 1-3 ... не 13,14 ...

Edit2: раствор

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main (int argc, char *argv[]){ 
FILE *outfp = fopen("test.txt", "r"); 
if (outfp == NULL){ 
printf("There was a problem: Temporary output-file could not be opened"); 
return 1; 
} 
// OUTPUT HANDLING 
char output_line[1024]; 
char output_cut[1024]; 
int line_number; 
char output_array[4][1024];  //The maximum number of possible entries is fixed 

// I got variables for the line, for the linenumber and output_cut is needed for sscanf 
while(fgets(output_line, sizeof(output_line), outfp)!=NULL){ 
sscanf(output_line,"%d;%s",&line_number,output_cut); 
strcpy(output_array[line_number],output_line); 
} 
printf("LINE1: %s",output_array[1]); 
printf("LINE2: %s",output_array[2]); 
printf("LINE3: %s",output_array[3]); 
return 0; 
} 

ответ

2

У вас есть две основные проблемы с кодом, как показано в вопросе. Во-первых, все указатели в output_array указывают на одно и то же место. Это означает, что при печати строк все напечатает то же самое (что будет последней прочитанной строкой).

Вторая проблема - это индексирование вашего массива. Индексы массивов идут от нуля до размера минус один, поэтому для вашего output_array индексы равны 0 по 2 (включительно). Проблема, связанная с сбоем, заключается в том, что вы используете индекс 3, который не связан с массивом, и приводит к неопределенным поведением.

+0

У меня есть вторая проблема, и я должен сказать, что не ошибся в главном коде. Но как я могу решить первую проблему? – Markus

+0

@Markus Первая проблема может быть решена несколькими способами. Самое простое - использовать такую ​​функцию, как 'strdup', чтобы« дублировать »строку. Задняя сторона заключается в том, что функция выделяет новую память для дубликата, которую вы должны «освобождать» позже. Второй способ - сделать 'output_array' массив массивов (например,' char output_array [3] [1024] ') и использовать' strcpy' для копирования строки. –

+0

Хорошо, это было решение. Поскольку я не могу «ответить» на свой вопрос, я отредактирую решение в теме. – Markus

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

  • Нет связанных вопросов^_^