Чтение одного файла, разбор и запись другого - PullRequest
0 голосов
/ 12 ноября 2010

Рассмотрим файл,

L,12/5/2008,Blacktown
C,Willy Wonker,10.00
C,Adolph Hitler,20.00
C,Attila the Hun,30.00
C,Idi Amin,40.00
C,Ghengis Khan,50.00
T,150.00
L,13/5/2008,Parramatta
C,Attila the Hun,100.10
C,Willy Wonker,200.20
C,Ghengis Khan,300.30
T,600.60
L,14/5/2008,Mount Druitt
C,Adolph Hitler,1000.00
T,2000.00
L,15/5/2008,Penrith
T,0.00
L,16/5/2008,Chatswood
C,Ghengis Khan,1.00
C,Idi Amin,10.00
C,Adolph Hitler,100.00
C,Attila the Hun,1000.00
T,1111.00

Мне нужно написать программу, которая открывает файл Collections.txt, читает его, форматирует в указанном порядке и записывает в другой файл с именем Reports.txt,Мне нужно иметь date, tab, а затем name.Затем новая строка и names, tab и amount.Повторяйте, пока не будет обнаружен T;это сигналы, у нас больше нет коллекций для вышеуказанного местоположения.Затем промойте и повторите для каждого местоположения, пока оно не достигнет конца файла, и итоговая сумма должна отображаться.

Вот код, который я написал,

/*
This program collects data and writes it to a specific file.*/

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

void debt_calculator();
void main()
{

    printf("This is a debt collection program:\n ");
    debt_calculator();
    scanf("%*c");
}

void debt_calculator()
{
    char code;
    int date [40];
    char location [40];
    char name [40];
    float amount = 0;
    float total = 0;
    float grand_total;
    int ctr = 0;

    FILE * Collections;
    Collections=fopen("C:\\Users\\Nick\\Documents\\Visual Studio 2010\\Projects\\Assignment2\\Assignment2\\Collections.txt","r");
    if(Collections==NULL)
    {
        printf("file not open:\n");
        exit(1);
    }

    FILE * Report;
    if((Report=fopen("C:\\Users\\Nick\\Documents\\Visual Studio 2010\\Projects\\Assignment2\\Assignment2\\Report.txt","w"))==NULL)
    {
        printf("can not open file: \n");
        exit(1);
    }


    fscanf(Collections,"%c,",&code);

    while(code == 'L')
    {
        fscanf(Collections,"%[^,],%s%*c",date,location);
        fprintf(Report,"Date: %s \t Location: %s \n\n",date, location);
        fscanf(Collections,"%c,",&code); 
    }

    for(code == 'C'; ctr < 5; ctr++)
    {
        fscanf(Collections,"%[^,], %f %*c",name, & amount);
        if(amount == 0)
        {
            fprintf(Report,"### No Collections for %s \n", location);
            fprintf(Report,"total: \t 0.00\n");
        }

        fprintf(Report,"\n Name: %s \t Amount: %.2f \n",name, amount);
        fscanf(Collections,"%c,",&code);
    }

    code == 'T';
    while(code == 'T')
    {
        fprintf(Report,"Hello");
        fscanf(Collections,"%f",& amount);
        total += amount;
        grand_total += total;
        fprintf(Report,"Total: \t %.2f \n",& total);
        fprintf(Report,"Grand Total of all Collections is: $ %.2f", grand_total);
        fscanf(Collections,"%c" , & code);
    }

    fclose(Collections);
    fclose(Report);
}

Когда я запускаюПриведенная выше программа отображает оператор printf(), и когда я нажимаю клавишу ввода, он выходит.После этого я открою свой файл report.txt и найду новую строку с вкладкой даты, а также все названия и стоимость до T.Как только он доходит до 'T', он останавливается, я не могу заставить его перейти в последний цикл while, прочитать итог и распечатать его в файл, а затем повторить, проверив код еще раз.Код после T - это L, поэтому он должен вернуться в первый цикл while и прочитать, чем записать дату и местоположение, но это не так.Есть идеи, что я делаю не так?

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

1 Ответ

2 голосов
/ 12 ноября 2010

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

Эта строка:

fprintf(Report,"Total: \t %.2f \n",& total);

определенно неверна,% f не ожидает указатель.

Если ожидается, что code == 'T'; заставит его войти в цикл, вы ошибаетесь, code = 'T'; сработает.

Аналогично в этом цикле:

for(code == 'C'; ctr < 5; ctr++)

Инициализирующее выражение должно быть code = 'C'

Попробуйте установить уровень предупреждения компилятора на \ W4 и \ Wx (все предупрежденияошибки), то компилятор может помочь вам обнаружить такие ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...