【问题标题】:Storing String on File in C在C中将字符串存储在文件中
【发布时间】:2012-11-10 20:06:50
【问题描述】:

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

#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 "(最后有一个额外的空间)并运行它时,第二个程序中的第三个字符串只输出Virtual(空格之后什么都没有) 然后第四个字符串又是垃圾。

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

期待您的帮助!

提前致谢。

【问题讨论】:

    标签: c file-handling


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      会将"Cipher," 读入name(除此之外:正确的参数应该是name 而不是&amp;name),然后下一次转换失败,因为fscanf 找不到',' .

      "Cipher "后面有空格,找到空格后扫描停止,然后下一次扫描在"Virtual""Street"之间的空格处停止,然后又没有','所要求的格式和进一步的转换失败。

      您应该检查fscanf 的返回值,以验证是否已完成适当数量的转换,如果成功的次数太少,请相应处理。

      在这里,您可以使用 %[^,] 字符集格式来扫描您的字符串,

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

      【讨论】:

      • 谢谢。有用。但是,请问%[^,] 是什么。看起来像一个正则表达式
      • 它是一种字符集格式,看起来像一个正则表达式,但要简单得多。您可以列出接受的字符 - %[abcdef0123456789] 例如十六进制数字 - 或拒绝的字符,如果括号内的第一个字符是 '^' - %[^\n \t] 将停止在换行符、空格或制表符处。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多