在C中存储文件串

时间:2012-11-22 12:09:26

标签: c file-handling

我创建了一个小程序来将一些记录输入到文件中。

#include<stdio.h>

int main(void)
{
    FILE *fp;
    //opening a file to write
    fp = fopen("try.rec","w");
    if(fp == NULL)
    {
        printf("\nSorry! Couldn't Create File");
        exit(-1);
    }
    int id = 1;
    char name[300] = "Cipher", address[300] = "Virtual Street", phone[20] = "223322212";
    fprintf(fp,"%d, %s, %s, %s", id, name, address, phone);
    fclose(fp);
    return 0;
}

现在,它做得很好,没有错误。但我也制作了一个小程序来阅读该记录:

#include<stdio.h>

int main(void)
{
    FILE *fp;
    fp = fopen("try.rec","r");
    if (fp == NULL)
    {
        printf("Could not Access File. :(");
        return -1;
    }
    int id;
    char name[300], add[300], phone[20];
    fscanf(fp, "%d , %s , %s , %s",&id, &name, &add, &phone);
    fclose(fp);
    printf("\nDetails from File try.rec\n---------------------------\nID: %d \nName: %s \nAddress: %s \nPhone: %s \n", id, name, add, phone);
    return 0;
}

但是当打印第三个字符串时,它会打印垃圾值。我深入挖掘并发现当我在我的第一个程序中用"Cipher"替换"Cipher "(最后有一个额外的空格)并运行它时,第二个程序中的第三个字符串仅输出{{1} (并且空格后没有任何内容)然后第四个字符串再次变为垃圾。

那么,有没有其他好的替代方法来放置和从C中的文件中获取字符串。或者我在我的任何一个程序中做错了什么?

预期你的帮助!

先谢谢。

2 个答案:

答案 0 :(得分:6)

问题是%s格式告诉fscanf读取所有非空白字符,所以

fscanf(fp, "%d , %s , %s , %s",&id, &name, &add, &phone);

会将"Cipher,"读入name(除了:正确的参数可能是name而不是&name),然后下一次转换失败,因为{{1}找不到fscanf

使用','后的空格,在找到空格后扫描停止,然后下一次扫描在"Cipher ""Virtual"之间的空格处停止,然后再次没有{ {1}}根据格式要求,进一步转换失败。

您应该检查"Street"的返回值,以验证是否已完成相应的转化次数,如果成功的次数太少,则相应地处理相关情况。

在这里,您可以使用','字符集格式来扫描字符串,

fscanf

答案 1 :(得分:1)

检查fscanf的返回值,它会返回成功转换的次数。另外,您告诉fscanf函数在空格上分隔标记(格式字符串中的空格),因此包含空格的字符串(如"Virtual Street")被视为两个标记。

我建议您使用fgets阅读整行,然后使用strtok分隔逗号上的字符串。