【发布时间】:2017-08-16 20:40:04
【问题描述】:
我是 C 的新手,我正在尝试逐行读取一个大文件(>30m 行)并将每行的一些值存储到一个数组中。输入文件的格式为:
1. inode 100660 uid 66322 gid 66068 bytes 5848 blks 128
2. inode 100662 uid 66492 gid 66076 bytes 159 blks 0
3. inode 100647 uid 66419 gid 66068 bytes 235 blks 0
4. inode 100663302 uid 66199 gid 66068 bytes 131 blks 0
5. inode 100663311 uid 66199 gid 66068 bytes 134 blks 0
这是我的代码:
void loadArrayFromFile(char * filename) {
long bytesArray[380000000];
FILE * myfile;
myfile = fopen(filename, "r");
char line[1024];
char inodeText[10];
long int inode = 0;
int mybytes = 0;
if(myfile == NULL) {
printf("No file found \n");
exit(EXIT_FAILURE);
}
while(fgets(line, sizeof(line), myfile)) {
int x = (sscanf(line, "%s %ld %*s %*d %*s %*d %*[bytes] %d %*[^\n]", inodeText, &inode, &mybytes));
if(x > 1) {
bytesArray[inode] = mybytes;
}
}
这个代码在前 3 行运行良好,但是当它到达第 4 行时,我得到一个 Segmentation Fault (core dumped) 错误。我怀疑这与 inode 值太大而无法存储到 int 中有关,即使 int 可以存储的最大值是 2147483647。有人可以帮我解决问题吗?
【问题讨论】:
-
inodeText缓冲区只有 10 个字节长。够了吗? -
我能看到的最长的单词是
bytes我想是 -
bytesArray定义在哪里? -
输入示例中的
1.和2.等是否是被扫描文本的一部分?如果是,那么第二个格式规范应该是%s。 -
@dbush bytesArray 在此方法的范围之外定义。为了便于阅读,我刚刚将其添加到代码块中。行号不是文件的一部分,我只是添加它们以便更容易地调用这些行。 inodeText 仅用于包含字符串“inode”,所以是的,缓冲区就足够了。