我需要阅读一行文本,将其存储到数组中。当我编译程序时,它可以工作但是当我执行它时,我收到一个分段错误。我已经阅读了其他问题并尝试了他们所建议的内容,似乎没有任何工作。
#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);
}
答案 0 :(得分:0)
继续发表评论,
text[i] = strdup (text);
错了。它尝试将指针(strdup
的结果)分配给text[i]
一个带符号的char
值。您需要使用单独的指针数组(或声明指向char 的指针的指针,例如char **lines;
,然后为每行指定指针。)
您可以做的最重要的事情是听取编译器告诉您的内容。为了确保您获得编译器帮助的好处,始终在启用警告的情况下编译,并且在没有警告的情况下编译之前不接受代码。对于gcc
,这意味着至少添加{{1你的编译字符串。对于-Wall -Wextra
,clang
会这样做。对于-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这样的内容