为什么在读取文本文件并存储到数组中时会出现分段错误?

时间:2017-09-27 02:18:38

标签: c

我需要阅读一行文本,将其存储到数组中。当我编译程序时,它可以工作但是当我执行它时,我收到一个分段错误。我已经阅读了其他问题并尝试了他们所建议的内容,似乎没有任何工作。

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

void main() {

FILE *file;
char text[10000000], *line[10000000];
int i=0;

file = fopen("/home/Documents/xxxxxx_HW01/text.txt", "r");
if(file == NULL) {
    printf("cannot open file");
    exit(1);
}

while (i< 10000 && fgets(text, sizeof(text), file)!= NULL){
    line[i] = strdup(text);
    i++;
}

for (i=0; text[i] != '\0'; i++)
    printf("%c ", text[i]);

fclose(file);

}

2 个答案:

答案 0 :(得分:0)

继续发表评论,

text[i] = strdup (text);

错了。它尝试将指针(strdup的结果)分配给text[i]一个带符号的char值。您需要使用单独的指针数组(或声明指向char 的指针的指针,例如char **lines;,然后为每行指定指针。)

您可以做的最重要的事情是听取编译器告诉您的内容。为了确保您获得编译器帮助的好处,始终在启用警告的情况下编译,并且在没有警告的情况下编译之前不接受代码。对于gcc,这意味着至少添加{{1你的编译字符串。对于-Wall -Wextraclang会这样做。对于-Weverything(VS),请添加cl.exe。然后阅读并理解警告。编译器将为您提供发生任何问题的确切行。

如果你只是读取少于某个数字的行,你可以避免分配指针并只使用指针数组,但你必须跟踪索引(以避免写入超出最后一个元素)

根据您的尝试,看起来您正在尝试执行类似以下操作:

/Wall

注意:您还应删除#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 1000 int main (void) { FILE *file; char text[MAX] = "", *lines[MAX] = {NULL}; int i=0, j; file = fopen ("/home/Documents/xxxxxx_HW01/text.txt", "r"); if(file == NULL) { printf("cannot open file"); exit(1); } while (i < MAX && fgets (text, sizeof(text), file)!= NULL){ size_t len = strlen (text); /* get length */ if (len && text[len-1] == '\n') /* check if last is '\n' */ text[--len] = 0; /* overwrite with '\0' */ else { /* line too long - character remain unread */ fprintf (stderr, "error: line exceeds %d chars.\n", MAX - 2); exit (EXIT_FAILURE); } lines[i] = strdup(text); i++; } for (j = 0; j < i; j++) { printf ("line[%3d] %s\n", j, lines[j]); free (lines[j]); /* don't forget to free memory */ } fclose(file); return 0; /* main() is type int and therefore returns a value */ } '\n'末尾所包含的结尾text - 上面给出的示例。

仔细看看,如果您有其他问题,请告诉我。

答案 1 :(得分:0)

根据我的记忆,sizeof将为您提供对象类型的大小,而fgets需要您想要读取的最大字符数,因此您可能不希望在那里使用sizeof。 你也无限期地增加你的数组的索引,这很可能会给你一个超出范围的例外。

总结我认为你应该尝试直接在fgets上传递你在数组上设置的大小,如果你不需要同时存储所有文件,就不要增加i并处理每个chunk in循环的一次迭代。如果您确实需要一次存储所有文件,请确保您拥有与文件大小一样大的数组,并且可能使用像this这样的内容