2014-10-03 3 views
2

В моем коде я читаю значения, разделенные запятыми из файла. Я использую функцию remove для удаления запятой. Там, где у меня возникают проблемы, повторяется строка. Я чувствую, что цикл for, который я использую для итерации по строке, является правильным, но я, вероятно, делаю что-то действительно глупо, потому что программа терпит неудачу. Итак, как я правильно перебираю строку?Итерация по строке в C

каждая строка в файле имеет формат, аналогичный:

0000000000001110,1 

Вот мой код:

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


void removeChar(char *str, char garbage); 

int main(){ 
    FILE *ifp; 
    char *mode = "r"; 
    ifp = fopen("in.csv", mode); 


    char* string; 

    int i, len; 
    while(fscanf(ifp, "%s", string)!=EOF){ 
     removeChar(string, ','); 
     printf("%s \n", string); //gives me correct output of string with no comma 
     len = strlen(string); 
     for(i=0; i<len; i++)  //where the error occurs 
      printf("%c", string[i]); 
    } 

    return 0; 
} 

void removeChar(char *str, char garbage) { 

    char *src, *dst; 
    for (src = dst = str; *src != '\0'; src++) { 
     *dst = *src; 
     if (*dst != garbage) dst++; 
    } 
    *dst = '\0'; 
} 
+0

какая ошибка вы получаете? – Haris

+0

@haris На самом деле нет ошибок, программа просто падает. – Ybarra

+0

Мне удалось выполнить итерацию по строке, используя тот же метод, но в другой программе. Я не знаю, что здесь отличает, что вызывает ошибку. – Ybarra

ответ

3

Вы определили string как:

char* string; 

, но вы не имеете выделил для нее память, прежде чем использовать ее для чтения данных из файла. Это приводит к неопределенному поведению.

Предложение:

  1. Использование массива.
  2. Использовать fgets вместо fscanf. fgets безопаснее, чем fscanf, так как вы указываете максимальное количество символов для чтения.

Вот обновленная версия main.

int main(){ 
    FILE *ifp; 
    char *mode = "r"; 
    ifp = fopen("in.csv", mode); 

    // Use an array of char. 
    char string[1024]; 

    int i, len; 
    // Use fgets instead of fscanf. 
    while(fgets(string, 1024, ifp) != NULL) { 
     removeChar(string, ','); 
     printf("%s \n", string); //gives me correct output of string with no comma 
     len = strlen(string); 
     for(i=0; i<len; i++)  //where the error occurs 
      printf("%c", string[i]); 
    } 

    return 0; 
} 
1

Обеспечить действительную память к указателю char* string;, прежде чем приступить к fscanf.

Else, попробовать, как этот

char string[1000]; // Здесь строка массив символов.

1

Вставка другого решения. Он фильтрует входные символы, что довольно быстро при чтении большого CSV-файла.

#include<stdio.h> 

#define LINE_MAXLEN  (1024) 

static size_t 
readline(char *buff, FILE *fp) 
{ 
     register char c; 
     char *p = buff; 
     while ((c = fgetc(fp)) > 43) if (c > 47) *p++ = c; // ord(',') == 44 and ord('0') == 48 
     *p = 0; 
     return (p - buff); 
} 

int 
main(void) 
{ 
     char line[LINE_MAXLEN]; 
     FILE *fp; 

     if ((fp = fopen("in.csv", "r")) == NULL) 
       perror("Error opening file"); 

     while (readline(line, fp)) 
       printf("line=%s\n", line); 

     return (0); 
} 
Смежные вопросы