嗨,我在下面有以下代码,其中我尝试将文件的所有行放入数组中...例如,如果在文件data.txt中我有以下内容:
第一行
第二行
然后在下面的代码中我想进入以下数据数组: data [0] =“第一行”; data [1] =“second line”
我的第一个问题:目前我收到“分段错误”......为什么?
我得到以下输出:
行数是7475613
分段错误
我的第二个问题:有没有更好的方法来做我想做的事情?
感谢!!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
FILE *f = fopen("data.txt", "rb");
fseek(f, 0, SEEK_END);
long pos = ftell(f);
fseek(f, 0, SEEK_SET);
char *bytes = malloc(pos);
fread(bytes, pos, 1, f);
int i =0;
int counter = 0;
for(; i<pos; i++)
{
if(*(bytes+i)=='\n') counter++;
}
printf("\nNumber of lines is %d\n", counter);
char* data[counter];
int start=0, end=0;
counter = 0;
int length;
for(i=0; i<pos; i++)
{
if(*(bytes+i)=='\n')
{
end = i;
length =end-start;
data[counter]=(char*)malloc(sizeof(char)*(length));
strncpy(data[counter],
bytes+start,
length);
counter = counter+1;
start = end+1;
}
}
free(bytes);
return 0;
}
在这种情况下,data.txt的第一行不是'\ n',而是:“23454555 6346346 3463463”。
谢谢!
答案 0 :(得分:4)
data[counter]
使用malloc 1个字符。strncpy
之后,您需要终止目标字符串。编辑原始问题后编辑
行数是7475613
Whooooooaaaaaa,这对你的电脑来说太过分了!
如果char *
的大小为4,则要在data
的分配中保留29902452字节(30M)的自动内存。
您可以动态分配该内存:
/* char *data[counter]; */
char **data = malloc(counter * sizeof *data);
/* don't forget to free the memory when you no longer need it */
编辑:第二个问题
我的第二个问题:有没有 做我想做的更好的方法吗?
不是真的;你做得对。但也许你可以在不需要同时在内存中存储所有数据的情况下进行编码 一次阅读并处理一行。
您还需要需要到循环中的free(data[counter]);
...并且free(data);
在上面的“您正确行事”之前是正确的:)< / em>的
您需要检查多个malloc()
调用中的每个调用是否成功
答案 1 :(得分:2)
首先,您需要检查文件是否正确打开:
FILE *f = fopen("data.txt", "rb");
if(!f)
{
fprintf(stderr,"Error opening file");
exit (1);
}
如果打开文件时出错并且您没有检查它,当您尝试查找无效的文件指针时,会出现seg错误。
除此之外我没有看到任何错误。尝试运行程序,通过在结尾处打印数据数组的值,它按预期运行。
答案 2 :(得分:0)
有一点需要注意的是,你打开你的文件作为二进制 - 行终止规则可能无法在你的平台上运行(UNIX是lf,Windows是cr-lf,某些版本的MacOS是cr)。 / p>