проблема с использованием fprintf - PullRequest
0 голосов
/ 17 марта 2011

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

Я был бы рад за некоторую помощь. Это код:

Я запускаю DynsaleDayPtr в основном:

FILE* DynsaleDayPtr = CreateTextFiles("sale_day.txt");  

Создать функцию:

FILE* CreateTextFiles (char* fileName)  
{  
    FILE* saleFilePtr=NULL;  

    if((saleFilePtr=fopen(fileName,"a+"))==NULL)  
        printf("File couldn't be opened\n");  
    return saleFilePtr;  
}  

Вызов функции TextAddSale выполняется из функции, которая вызывается в основном:
TextAddSale(DynSaleDayPtr,dynNumOfRecords);

Bool TextAddSale (FILE* DynsaleDayPtr, int* dynNumOfRecords)  
{  

    char id[6];  
    char name [50];  
    char priceChar[20];  
    char* tmp = NULL;  
    int price=-1;  
    DynamicRecord * newRec=NULL;  

    scanf("%s%s%s",id,name,priceChar);

    newRec = (DynamicRecord *)malloc(sizeof(DynamicRecord));  
    if (newRec == NULL)  
        return False;  
    tmp = (char*)malloc(strlen(name)+1);  
    if (tmp == NULL)  
    {  
        free (newRec);  
        return False;  
    }  
    strcpy(tmp,name);  
    newRec->productName = tmp;  
    strcpy(newRec->productId, id);  
    newRec->productPrice=atoi (priceChar);  

    if (fprintf(DynsaleDayPtr,"%d %s %s %d", strlen(newRec->productName),  
    newRec->productId, newRec->productName, newRec->productPrice)>0)  
    {  
        *dynNumOfRecords=(*dynNumOfRecords)+1;  
        return True;  
    }  
}

спасибо!

Ответы [ 4 ]

1 голос
/ 17 марта 2011

Вам нужно очистить поток.

fflush(FILE*);

Конечно, вы должны закрыть поток, если вы сделали с ним.

fclose(FILE*);
0 голосов
/ 17 марта 2011

Мысль:

scanf("%s%s%s",id,name,priceChar);

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

лучше использовать fgets (), а затем анализировать строку, извлекая отдельные значения или создайте лучший спецификатор формата.

Если приведенный выше оператор вызывает перезапись памяти остальной части вашей программы может вызвать сбои в работе, например, то, что вы описываете.

0 голосов
/ 17 марта 2011

fprintf() скорее всего использует буферизованный вывод. Поэтому вам следует либо fflush() поток DynSaleDayPtr, либо, что еще лучше, распечатать новую строку в файле. Последнее имеет дополнительное преимущество, заключающееся в том, что содержимое файла действительно читается ...

Кроме того, не забудьте close() поток, когда вы закончите писать. Это также сделает fflush() ненужным.

0 голосов
/ 17 марта 2011

Согласитесь с @pmg - попробуйте что-то вроде этого:

FILE *pFile = fopen("foo.txt","w");
if (pFile==NULL)
   bad();
fprintf(pfile,"Hello world\n");
fclose(pfile);

сначала сделайте так, а потом исправьте все, что не так в большом приложении -

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