2014-05-08 147 views
3

我试图读取具有以下格式的.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的选择吗?

预先感谢您。

+0

@Jose你需要检查'fscanf'返回你所期望的匹配数量。在你现在的代码中,'1',在R Sahu的答案中,'2'。这就是为什么你看到*垃圾* - 因为'fscanf'没有存储*任何*那里。 –

回答

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++; 
    } 
} 
+0

非常感谢!这解决了它。 – Jose

+1

欢迎您,我认为您了解代码并且无需详细说明。 – jahan

1

即使您不打算从文件中使用字母表中的字符,仍需要添加代码才能读取字符。否则,尝试读取数字将卡在下一封信。

char ch; 

// .... 

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

感谢您的回复,但是当我添加代码时,我仍然得到相同的输出。 – Jose

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足够大 - 可以通过使用动态内存或预先安装文件中的行来实现。

相关问题