C/字符串数据从文件到数组.分段故障



我正在编写一个程序,该程序从文本文件中流流并将其放入数组中。我还添加了数组数据的显示,以查看一切是否还可以,但是在编译后我会发现一个细分故障。

我是系统编程的新手,所以我知道我可能犯了一些基本错误。请找到下面的代码,并告诉我我在哪里出了问题。

#include <stdio.h>
#define BUFFER 100
int main() {
    char tab[BUFFER];
    FILE *wp;
    wp = fopen("tab_file_b_words.txt", "r");
    if(wp == NULL)
    {
        printf("error/n");
        return -1;
    }
    int i;
    for(i=0; i<sizeof(wp); i++) {
        if(wp != NULL)
            fscanf(wp, "%s", &tab[i]);
        else 
            break;
        }
    printf("Content: n");
    for(i = 0; i < BUFFER; i++) {
        if(tab[i] != NULL)
            printf("%sn", tab[i]);
        else 
            break;
        }
    fclose(wp);
    return 0;
}
  1. 到目前为止,您的数组是char

    您需要的是

       char tab[BUFFER]; --> char tab[BUFFER][SOME_LENGTH];
    

       fscanf(wp, "%s", &tab[i]); --> fscanf(wp, "%s", tab[i]);
    
  2. %s期望null终止char *,但您正在通过char

        printf("%sn", tab[i]);
    
  3. sizeof(wp)是指针的大小。

    for(i=0; i<sizeof(wp); i++)
    

    您需要的是

      while (1 == fscanf(wp, "%s", tab[i]))
      {
             ...
      }
    

本节:

for(i=0; i<sizeof(wp); i++) {
    if(wp != NULL)
        fscanf(wp, "%s", &tab[i]);
    else 
        break;
    }

是有问题的。

首先,该行有两个问题:fscanf(wp, "%s", &tab[i]);应该写为: fscanf(wp, "%s", tab); //removed & and array notation.
intfloat变量类型不同,您的char数组的名称(即tab(已经是指向变量地址的指针,使其不必要(不正确(使用 operator的地址(&(。

与上述... 有关(可能是分割故障的原因。(
因为tab的定义用于char的简单数组(char tab[BUFFER];(,因此符号tab[i]仅指数组的ITH byte(或char(,而不是整个数组。由于使用了"%s"格式指示符,因此函数 fscanf((期望char *不是char,使tab成为正确的参数。

如果要使用一系列行,则必须创建变量,以作为char的 2d 数组:

#define NUM_LINES 100
#define LINE_LEN 80
int main() {
    char tab[NUM_LINES][LINE_LEN] = {{0}}; // zero initialized array of 
                                           // NUM_LINE strings
                                           // each of LINE_LEN-1 capacity

在语句for(i=0; i<sizeof(wp); i++) {

sizeof(wp)

将等于指针wp的字节数,根据您的应用程序的目标处理,为32或64。这可能不是您想要的。(或想要。(

考虑一种不同的方法:
鉴于您正在使用文本文件,请尝试使用while() fgets((的组合来读取文件的行。然后,您可以根据已知的语法处理每条线。
(以下示例使用单个维度char数组进行简化的图表。(

char line[some_len];
wp = fopen(some_file_name, "r");
if(wp)
{
    while(fgets(line, some_len, wp))
    {
        // use line.  In this case, just print to stdout
        printf("%sn", line);
    }
    fclose(wp);
}

sizeof(wp)是问题所在。 sizeof返回类型的长度,而不是文件的长度。

如果您想获得文件的大小,这可能会对您有所帮助。

最新更新