将整数值存储在字母数字字符串中

时间:2014-05-08 23:59:52

标签: c

我正在尝试使用下面的格式读取.txt,以便创建一个大小为26的数组(字母表中每个字母1个)。

a 5
b 2
c 4
d 10
e 11
f 5
g 7
...

我尝试使用下面的(非工作)代码执行此操作,发送空的vec [26]作为参数,以及包含每个单词的值的.txt:

void readvalues(FILE*values, int*vec)
{
    if (values == NULL) 
    { 
        printf("Couldn't open values' file\n"); 
        exit(0); 
    } 

    int i=0;

    while (i<26) 
    {   
        fscanf(values,"%d",&vec[i]);
        printf("%d\n",vec[i]); 
        i++;
    }
}

当我检查printf输出时,我看到vec [0]是正确的,但是此功能开始在剩余位置上存储垃圾。 造成这种情况的原因是什么?如何解决?除了fgets之外还有替代fscanf吗?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

即使您不打算使用文件中的字母字符,仍然需要添加代码来读取字符。否则,尝试读取数字将被卡在下一个字母。

char ch;

// ....

fscanf(values,"%c %d", &ch, &vec[i]);

答案 1 :(得分:1)

这可以帮到你:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void readvalues(FILE *values);

FILE *datafile;
int vec[26];

int main()
{

    datafile = fopen ( "my.txt", "r");
    readvalues(datafile);


    return 0;
}

void readvalues(FILE *values)
{
    char tmp[2];
    if (values == NULL) 
    { 
        printf("Couldn't open values' file\n"); 
        exit(0); 
    } 

    int i=0;

    while (i<26) 
    {   
        if(fscanf(values,"%s %d",tmp,&vec[i]));
        printf("%d\n",vec[i]); 
        i++;
    }
}

答案 2 :(得分:0)

而是使用固定值26进行循环,您可能需要逐行考虑循环,直到文件中的数据消失为止:

int getdata(FILE *ifp, int *data){
    char buf[256];    // potential size of leading string
    int i=0;          // offset into data array

    while (fscanf(ifp, "%s %d", buf, &data[i]) != EOF) {
        i++;   
    }    
    return i;         // return how many ints were read and processed
}

然后你的文件可以有2行或200万行。您只需要确保data足够大 - 通过使用动态内存或预先排除文件中的行。