2016-12-12 2 views
0

У меня возникли проблемы с моим кодом.Передача значений из текстового файла в массив

Моя программа вычисляет количество сопротивления в зависимости от цвета трех полос, поступающих из входного файла, а затем распечатывается в выходной файл.

Пример входного файла:

красный, зеленый, синий
зеленый, серый, желтый

Пример выходного файла:

сопротивление в омах = 680
Сопротивление в кило-омах = 1420

Однако каждый раз, когда я запускаю программу, он сработает. Я сделал некоторую отладку и обнаружил, что у нее есть проблема с индексом yellow от decodeString, давая ему значение NULL. Я частично исправил эту проблему, передав значения функции decodeString вместо использования указателей, и теперь это работает.

Сейчас я не получаю правильный вывод, который ожидаю, и я не знаю, откуда исходит ошибка. Код, который у меня запущен, но не дает правильного вывода на данный момент. Я просто не знаю, где искать.

Думаете, кто-нибудь может помочь мне исправить это? Или если есть что-то, что я мог бы сделать неправильно, укажите это и объясните, почему это пошло не так. Это будет очень полезно!

Прокомментированные строки были использованы для отладки.

#include<string.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
#define size 100 

int DecodeString(char inputString[]){ 
    const char kColorTable[10][10] = {"black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "gray", "white"}; 
    int i; 

    for(i=0; i<10; i++){ 
    //printf("\n>>%s,%s",inputString,kColorTable[i]); 
    if(strcmp(inputString, kColorTable[i]) == 0){ 
     return i; 
    } 
    } 
    return -1; 
} 

int main(){ 
    int i=0, colord[3]={0,0,0}; 
    char color[size], *token, *inputString; 
    double resistance=0, value; 

    FILE *fptrin, *fptrout; 
    if(((fptrin = fopen("input.txt", "r"))==NULL) || ((fptrout = fopen("output.txt", "w")) == NULL)){ 
    printf("Error 404: File not found"); 
    exit(1); 
    } 

    while(fgets(color, size, fptrin)!=NULL){ 
    token = strtok(color, ","); 
    while(token != NULL){ 
     if(token[strlen(token)-1]=='\n') 
     token[strlen(token)-1]='\0'; 
     colord[i] = DecodeString(token); 
     //printf(">>%s:%d ",token,colord[i]); 
     i++; 
     token = strtok(NULL, ","); 
     puts(""); 
    } 

    //printf("<><>"); 
    if (colord[0] == -1 || colord[1] == -1 || colord[2] == -1){ 
     printf("\n\nBad code -- cannot compute resistance\n"); 
    } 

    else{ 
     resistance = (10.0 * colord[0] + colord[1]) * pow(10.0, colord[2]); 
    } 

    printf("%f",resistance); 
    if(resistance > 1000){ 
     fprintf(fptrout,"Resistance in Kilo-Ohms: %f",resistance); 
    } 

    else{ 
     fprintf(fptrout,"Resistance in Ohms: %f",resistance); 
    } 
    } 

    //fclose(fptrin); 
    //fclose(fptrout); 

    getchar(); 
    return 0; 
} 

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

синий, черный
синий, коричневый
синий, красный
синий, оранжевый
синий, желтый
синий, зеленый
синий, синий
красный, черный
красный, коричневый
красный, красный
, blackn
, brownn
, redown
, оранжевый
, желтый
, greenn
, bluewn
, фиолетовый
, graywn
, отбеливает

+1

'файл не найден 'будет вызывать путаницу, когда проблема будет отсутствием разрешения. Попробуйте 'if (fopen (path," r ") == NULL {perror (path) ...' –

+0

Можете ли вы привести пример с ожидаемым результатом и тем, что вы получаете вместо этого? Одна очевидная вещь: при выводе в kOhms вы должны разделите число на 1000. –

+0

Кроме того: если вы добавите новую строку в строку разделителей токенов, которая немного очистит код - 'strtok (color,", \ n ");' и 'strtok (NULL,", \ n ");' –

ответ

0

первая ошибка в коде, который я вижу, это та t вы не удаляете пробелы из входной строки, что вы можете сделать, изменив строку разделителя токена на " ,". Вы также можете немного упростить код, удалив новую строку одновременно.

Разумно также ограничить диапазон i, так как любой линии с более чем 3-х цветов разобьет массив colord[], и это было бы обратил ваше внимание на вторую ошибку, которая вы забыли сбросить i в пределах цикла , и это может объяснить, почему вы получаете сбои.

while(fgets(color, size, fptrin) != NULL) { 
    i = 0;         // reset `i` 
    token = strtok(color, " ,\n");   // test for space and newline 
    while(token != NULL && i < 3) {   // test `i` too 
     colord[i] = DecodeString(token); 
     i++; 
     token = strtok(NULL, " ,\n");  // test for space and newline 
    } 
} 

Наконец, вы должны делить на 1000 при отображении kOhms.

+0

Я на самом деле не полностью выполненная с помощью всей программы, я буду проверять, что есть недопустимый цвет, то есть цвет не в массиве, или если есть менее 2 или более трех цветов, прямо сейчас, я просто пытаюсь убедиться что он читает и вычисляет правильно. Я пробовал это, и все еще получаю плохой код. –

+0

Что вы подразумеваете под «плохим кодом»? –

+0

мой вывод ... он печатает плохой код всякий раз, когда передается неправильное значение. На данный момент я совсем застрял. –

0

При использовании

token = strtok(color, ","); 

вы только разделить на «» но на файле вы должны также пробел после него, так что, вероятно, следует

token = strtok(color, ", "); 

или удалить пробелы из файл

Также для кило-ом я думаю, что вы забыли/1000 в печати

if(resistance > 1000){ 
    fprintf(fptrout,"Resistance in Kilo-Ohms: %f",resistance/1000); 
} 
Смежные вопросы