2013-11-20 5 views
1

Я пытаюсь создать программу на языке C, которая может принимать информацию о сотрудниках в форме массива (не параллельной) и выводить ее в текстовый файл. Программа будет сравнивать код задания и рассчитать комиссионные за сотрудника. У меня есть 2 вопроса:C Язык - печать массива в текстовый файл

1 - комиссия продавцаПерсона всегда 0, даже когда я вхожу в один из TEL, SAL, SSR. Это проблема с моим сопоставлением строк?

2 - как я могу выводить результаты в текстовый файл (внутри папки проекта)?

Редактировать - Я понял, как напечатать мой файл в txt. Спасибо за вашу помощь!

#include "stdafx.h" 
#include <string.h> 
#include <stdlib.h> 

//job codes 
char TEL[4] = "TEL"; 
char SAL[4] = "SAL"; 
char SSR[4] = "SSR"; 

//create a sales person structure 
struct salesPerson 
{ 
    char name[31]; 
    int salesID; 
    char jobCode[4]; 
    double totalSales; 
    double commission; 
}e[10]; //make an array of 10 employees 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    //get employee info 
    for(int i=0; i<3; i++) 
    { 
     printf("\nEnter the sales person's name: "); 
     scanf(" %s", &e[i].name); 
     printf("\nEnter the sales person's ID: \n"); 
     scanf(" %d%*c", &e[i].salesID); 
     printf("\nEnter the sales person's job code: \n"); 
     scanf(" %s", &e[i].jobCode); 
     printf("\nEnter the total sales of the sales person: "); 
     scanf(" %lf", &e[i].totalSales); 

     //determine commission based on jobCode 
     if(strcmp(e[i].jobCode, TEL) == 0) 
     { 
      e[i].commission = e[i].totalSales*0.02; 
     } 
     if(strcmp(e[i].jobCode, SAL) == 0) 
     { 
      e[i].commission = e[i].totalSales*0.05; 
     } 
     if(strcmp(e[i].jobCode, SSR) == 0) 
     { 
      e[i].commission = e[i].totalSales*0.07; 
     } 
     else 
     { 
      printf("\n----------"); 
     } 
    } 

    printf("\n%d\n", e[0].commission); 
    printf("\n%d\n", e[1].commission); 
    printf("\n%d\n", e[2].commission); 

    //print stuff to txt file 
    FILE *fpOut, *fpIn; 
    /* 
    if ((fpIn = fopen("c:\\temp\\salesEmployees.txt", "w")) == NULL) 
    { 
     printf("Error opening the file for processing\n\n"); 
    } 
    else 
    { 
     fpOut = fopen("c:\\temp\\salesEmployees.txt", "w"); 
     for(int i=0; i<3; i++) 
     { 
      //fscanf(fpIn,"%[^\n]", &e[i].name); 
      //fscanf(fpIn,"%f%*c", &e[i].salesID); 

      fprintf(fpOut, "\nName: %s", e[i].name); 
      fprintf(fpOut, "\nSalesID: %d*c ", e[i].salesID); 
      fprintf(fpOut, "\nJob code: %s ", e[i].jobCode); 
      fprintf(fpOut, "\nTotal sales: %.2lf", e[i].totalSales); 
      fprintf(fpOut, "\nCommission earned: %.2lf", e[i].commission); 
      fprintf(fpOut, "\n\n"); 
     } 

     //fclose(fpOut); 
    }*/ 

} 
+0

Сравнение строк для комиссии выглядит правильно - но вы, вероятно, должны использовать 'else if', чтобы при выводе правильного значения вы прекратили проверку, что также предотвратит его приращение" \ n ------ ----». –

+0

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

+0

Я прокомментировал код для печати на txt, потому что он сбой моей программы, я не понял, как это исправить. Кроме того, я надеялся сделать txt-файл внутри папки проекта и все еще работать, когда я перемещаю проект. Также thx to Floris Я исправил проблему сравнения – user3011161

ответ

1

Всегда смотрите на предупреждения своего компилятора. У вас есть

printf("\n%d\n", e[0].commission); 

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

printf("\n%.2lf\n", e[0].commission); 

И вы получите комиссию в долларах и центах. То же самое для других линий.

1

Чтобы ответить на вторую часть вашего вопроса (о сбое программы и сохранении файла в том же каталоге): вы открываете тот же файл для ввода и вывода без закрытия между ними; не знаю, почему вход есть. Предполагая (для простоты), что вы хотите сохранить только то, что было введено с клавиатуры, вы можете просто удалить всю ссылку на fpIn. Что касается «сохранить файл в одной папке» - просто используйте относительный путь. Когда вы запустите от c:\my\dir, тогда открытие файла salesOutput.txt приведет к его записи в c:\my\dir\salesOutput.txt.

полный и рабочий код (некоторые изменения, чтобы приспособить мои настройки компилятора ...):

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

//job codes 
char TEL[4] = "TEL"; 
char SAL[4] = "SAL"; 
char SSR[4] = "SSR"; 

//create a sales person structure 
struct salesPerson 
{ 
    char name[31]; 
    int salesID; 
    char jobCode[4]; 
    double totalSales; 
    double commission; 
}e[10]; //make an array of 10 employees 

int main(int argc, char* argv[]) 
{ 
    //get employee info 
    int i; 
    for(i=0; i<3; i++) 
    { 
     printf("\nEnter the sales person's name: "); 
     scanf(" %s", &e[i].name); 
     printf("\nEnter the sales person's ID: \n"); 
     scanf(" %d%*c", &e[i].salesID); 
     printf("\nEnter the sales person's job code: \n"); 
     scanf(" %s", &e[i].jobCode); 
     printf("\nEnter the total sales of the sales person: "); 
     scanf(" %lf", &e[i].totalSales); 

     //determine commission based on jobCode 
     if(strcmp(e[i].jobCode, TEL) == 0) 
     { 
      e[i].commission = e[i].totalSales*0.02; 
     } 
     if(strcmp(e[i].jobCode, SAL) == 0) 
     { 
      e[i].commission = e[i].totalSales*0.05; 
     } 
     if(strcmp(e[i].jobCode, SSR) == 0) 
     { 
      e[i].commission = e[i].totalSales*0.07; 
     } 
     else 
     { 
      printf("\n----------"); 
     } 
    } 

    printf("\n%lf\n", e[0].commission); 
    printf("\n%lf\n", e[1].commission); 
    printf("\n%lf\n", e[2].commission); 

    //print stuff to txt file 
    FILE *fpOut; 
    { 
     if((fpOut = fopen("salesEmployees.txt", "w")) == NULL) 
     { 
      printf("Unable to open file - quitting\n"); 
      return -1; 
     }; 
     int i; 
     for(i=0; i<3; i++) 
     { 
      fprintf(fpOut, "\nName: %s", e[i].name); 
      fprintf(fpOut, "\nSalesID: %d*c ", e[i].salesID); 
      fprintf(fpOut, "\nJob code: %s ", e[i].jobCode); 
      fprintf(fpOut, "\nTotal sales: %.2lf", e[i].totalSales); 
      fprintf(fpOut, "\nCommission earned: %.2lf", e[i].commission); 
      fprintf(fpOut, "\n\n"); 
     } 
     fclose(fpOut); 
    } 
} 

Очевидно, желательно (и необходимо), чтобы добавить добавление I/O, проверка ошибок на входах, и т.д. - но это должно привести вас к тому, что «это не работает, и я не знаю почему». Я действительно задавался вопросом, почему у вас есть *c в распечатке идентификатора продаж - он просто добавляется к выходу, но я решил не удалять его.

Удачи вам в кодировании!

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