gpt4 book ai didi

c - 如何将文件中的行存储到动态数组中并打印?

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:17 24 4
gpt4 key购买 nike

我需要在 ANSI C 中打开一个文件,将其所有行读入一个动态分配的字符串数组,然后打印前四行。该文件可以是任意大小,最多 2^31-1 个字节,而每行最多 16 个字符。我有以下内容,但它似乎不起作用:

#define BUFSIZE 1024
char **arr_lines;
char buf_file[BUFSIZE], buf_line[16];
int num_lines = 0;
// open file
FILE *fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("Error opening file.\n");
return -1;
}
// get number of lines; from http://stackoverflow.com/a/3837983
while (fgets(buf_file, BUFSIZE, fp))
if (!(strlen(buf_file) == BUFSIZE-1 && buf_file[BUFSIZE-2] != '\n'))
num_lines++;
// allocate memory
(*arr_lines) = (char*)malloc(num_lines * 16 * sizeof(char));
// read lines
rewind(fp);
num_lines = 0;
while (!feof(fp)) {
fscanf(fp, "%s", buf_line);
strcpy(arr_lines[num_lines], buf_line);
num_lines++;
}
// print first four lines
printf("%s\n%s\n%s\n%s\n", arr_lines[0], arr_lines[1], arr_lines[2], arr_lines[3]);
// finish
fclose(fp);

我在如何定义 arr_lines 以便写入其中并轻松访问其元素方面遇到了麻烦。

最佳答案

您的代码中存在一些问题,但主要问题是在 malloc 行中您取消引用了一个未初始化的指针。此外,除非您的行由单个单词组成,否则您应该使用 fgets() 而不是 fscanf(...%s...) 因为后者在读取一个单词而不是一行后返回。即使你的行是单词,无论如何使用你用来计算行数的相同类型的循环更安全,否则你可能会阅读比你分配的更多的行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
#define LINESIZE 16
char *arr_lines, *line;
char buf_line[LINESIZE];
int num_lines = 0;
// open file
FILE *fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("Error opening file.\n");
return -1;
}
// get number of lines; from http://stackoverflow.com/a/3837983
while (fgets(buf_line, LINESIZE, fp))
if (!(strlen(buf_line) == LINESIZE-1 && buf_line[LINESIZE-2] != '\n'))
num_lines++;
// allocate memory
arr_lines = (char*)malloc(num_lines * 16 * sizeof(char));
// read lines
rewind(fp);
num_lines = 0;
line=arr_lines;
while (fgets(line, LINESIZE, fp))
if (!(strlen(line) == LINESIZE-1 && line[LINESIZE-2] != '\n'))
line += LINESIZE;
// print first four lines
printf("%s\n%s\n%s\n%s\n", &arr_lines[16*0], &arr_lines[16*1], &arr_lines[16*2], &arr_lines[16*3]);
// finish
fclose(fp);
return 0;
}

希望这对您有所帮助!

关于c - 如何将文件中的行存储到动态数组中并打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8595660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com