在C中使用strsep和fwrite时输出奇怪

时间:2013-04-14 01:34:33

标签: c string file fwrite strsep

我打算创建一个python程序来读取XML文档,并在执行操作时将其用作参考。但是,XML文档手动创建会很繁琐,所以我决定制作一个C程序来完成它的大部分工作,不包括第一行和根元素。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
    FILE * fp = fopen("/Users/rajshrimali/Desktop/SPC_CMS.txt", "r");
    FILE * fw = fopen("/Users/rajshrimali/Desktop/SPC_XML", "a");
    char *line = NULL;
    size_t linecap = 0;
    ssize_t linelen;
    while ((linelen = getline(&line, &linecap, fp)) > 0){
        char *token;
        int x = 1; 
        while((token = strsep(&line, ",")) != NULL){
            printf("%s", token);
            if(x == 1){
                fwrite("<item> \n", linelen, 1, fw);
                fwrite("<name> \n", linelen, 1, fw);
                fwrite(token, linelen, 1, fw);
                fwrite("\n </name> \n", linelen, 1, fw);
                x++; 
            }
            if(x == 2) {
                fwrite("<SPC> \n", linelen, 1, fw);
                fwrite(token, linelen, 1, fw);
                fwrite("\n </SPC> \n", linelen, 1, fw);
                fwrite("</item> \n", linelen, 1, fw);
            }
        }
    }
}

编译时没有错误的代码。但是,当我运行它时,文件SPC_XML几乎不对:

<item> 
�<na<name> 

 <Agate�0.80

 </name> 
�<SPC> 

 </Agate�0.80

 </SPC> 
<</item> 
,�<item> 
<na<name> 

这个废话持续了一段时间。 输入文件fp包含以下格式的数据:

Agate,0.80
Aluminum bronze,0.436
Aluminum,0.87
Antimony,0.21
Apatite,0.84

认为错误与fwrite有关,虽然我不知道它是什么。问题是什么?

2 个答案:

答案 0 :(得分:2)

您的if语句有一些明显错误,当您使用=相等时,您正在使用==分配,例如:

 if(x = 1)

应该是:

if(x == 1)

我建议启用警告,使用gcc和-Wall -W -pedantic你会看到类似的内容:

warning: suggest parentheses around assignment used as truth value [-Wparentheses]
         if(x = 1){

答案 1 :(得分:2)

当您调用fwrite时,第二个参数应该是您正在编写的字符串的长度。所以,当你这样做时:

fwrite("<item> \n", linelen, 1, fw);

你最终会写出额外的数据,或者可能还不够,这取决于linelen是什么。相反,您应该手动计算字符串的大小,或者在每个字符串上调用strlen。所以,上面的调用可以变成:

fwrite("<item> \n", 8, 1, fw);

当你写出令牌时,你应该拨打strlen

fwrite(token, strlen(token), 1, fw);