我正在编写一个程序,该程序从文本文件中流流并将其放入数组中。我还添加了数组数据的显示,以查看一切是否还可以,但是在编译后我会发现一个细分故障。
我是系统编程的新手,所以我知道我可能犯了一些基本错误。请找到下面的代码,并告诉我我在哪里出了问题。
#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;
}
-
到目前为止,您的数组是
char
您需要的是
char tab[BUFFER]; --> char tab[BUFFER][SOME_LENGTH];
和
fscanf(wp, "%s", &tab[i]); --> fscanf(wp, "%s", tab[i]);
-
%s
期望null
终止char *
,但您正在通过char
。printf("%sn", tab[i]);
-
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.
与int
或float
变量类型不同,您的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
返回类型的长度,而不是文件的长度。
如果您想获得文件的大小,这可能会对您有所帮助。