2011-03-16 58 views
0

我试图打印到一个文本文件很多变量,但它不工作。 我检查并验证了我用正确的语法编写它。 我也检查了返回值,它是积极的,因此我知道它没有写入文件,但是当我打开文件时它是空的。问题使用fprintf

我很乐意提供一些帮助。 这是代码:

我发起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; 
    } 
} 

谢谢!

+0

什么是'DynsaleDayPtr'?我没有看到它在任何地方宣布。 – 2011-03-16 23:45:59

+0

也许我错过了它,但你在哪里打开文件? – jonsca 2011-03-16 23:47:14

+1

您是否在写入记录后关闭了文件?当你说你打开它并发现它是空的,你的意思是你用文本编辑器或其他东西来看它,或者你的代码打开它并尝试读取它? – 2011-03-16 23:49:12

回答

0

同意@pmg - 尝试这样的事:

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

进行第一次合作 - 再解决什么是错在大的应用程序 -

0

一个想法:

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

的上面的语句有点狡猾,因为你没有说每个字符串中应该包含多少个字节 。

最好使用fgets()然后解析检索单个值的字符串 或创建一个更好的格式说明符。

如果上述语句导致内存覆盖程序的其余部分,可能会导致故障,如您所描述的内容。

0

fprintf()最有可能使用缓冲输出。因此,您应该要么fflush()DynSaleDayPtr流,或者更好的是,打印换行到文件。后者具有使文件内容实际可读的附加好处...

此外,不要忘记close()当你完成写作。这也将不需要0​​。

+1

写一个换行符到文件只会导致它被刷新,如果它被设置为行缓冲。 'fopen'后默认不是这种情况;你需要调用'setvbuf'来实现它。 (我完全忘记了标准中关于默认缓冲模式的说法 - 我认为*它表示'fopen'默认提供了块缓冲 - 但它肯定不能保证文件是行缓冲的。) – 2011-03-17 13:05:36

1

您需要刷新流。

fflush(FILE*); 

当然,你必须关闭流,如果你已经完成了它。

fclose(FILE*);