从文本文件读取C中的不同类型变量

时间:2014-05-04 15:29:29

标签: c variables char int text-files

我有这个:

#define TYPESIZE 180  

char buff[TYPESIZE];
char dat_nazev[TYPESIZE];
int  dat_rok;

我用它来从文本文件中读取 char和int data 。我需要将它们写入屏幕(这是可行的),之后使用ADD方法将其添加到我的结构中:

int pom = 1;

        while(fgets(buff, 1000, fr) != NULL)
        {
            switch (pom) 
            {
            case 1: 
                printf ("Nazev: %s", buff);
                dat_nazev=buff;
                pom++;
                break;
            case 2:
                printf ("Rok vydani: %s", buff);
                dat_rok=int(buff);
                pom++;
                break;
            case 3: 
                printf ("Popis: %s", buff);
                dat_popis=buff;
                add(dat_nazev, dat_rok, dat_popis); 
                pom =1;
                break;          
                }
}

但这不起作用。如果我尝试将 buff分配给dat_nazev (或任何东西),这个goto会失败。

  

错误C2106:'=':左操作数必须是l值

buff和dat_nazev是相同的日期类型......

并且 dat_rok = int(buff)不给mi相同的值 - 比如1986等等到dat_rok。

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

要复制字符串,您需要使用strcpy()之类的函数,不能将其分配给C中的数组。

例如:

#include <string.h>

...

    case 1: 
        printf ("Nazev: %s", buff);
        strcpy(dat_nazev, buff);

请注意,您#define TYPESIZE 180,然后使用fgets()读取1,000个字符,这样您可能会读取的数据超过存储空间的数据,这可能会很糟糕。 strncpy()是一种替代方案,它允许您对复制的字符数进行限制,但strncpy()如果达到限制则不会对字符串进行空终止,有时(例如,当使用文件名时)仅使用部分数据副本然后使用它可能与溢出一样糟糕,所以无论哪种方式,您通常都需要非常严格地检查输入并仔细管理内存。

您也无法使用强制转换将字符串转换为其他类型,就像使用其他一些高级编程语言一样。您需要strtol()

之类的内容
#include <stdlib.h>

...

    case 2:
        printf ("Rok vydani: %s", buff);
        char * endptr;
        dat_rok = (int) strtol(buff, &endptr, 10);
        if ( *endptr ) {
            fputs("Invalid data, not an integer", stderr);
            exit(EXIT_FAILURE);
        }

字符串处理在C语言中比在其他一些更高级别的语言中更多。