Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将文件中的行存储到动态数组中并打印?_C_Arrays_Malloc_Scanf_Strcpy - Fatal编程技术网

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

C 如何将文件中的行存储到动态数组中并打印?,c,arrays,malloc,scanf,strcpy,C,Arrays,Malloc,Scanf,Strcpy,在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) {

在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_行方面遇到了问题,以便写入并轻松访问其元素。

更改

(*arr_lines) = (char*)malloc(num_lines * 16 * sizeof(char));

然后在它下面的while循环中,添加

arr_lines[n] = malloc(16 * sizeof(char));

代码中存在一些问题,但主要问题是在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;
}
#包括
#包括
#包括
内部主(空){
#定义线宽16
字符*arr_行,*行;
char buf_行[行大小];
int num_行=0;
//打开文件
FILE*fp=fopen(“FILE.txt”、“r”);
如果(fp==NULL){
printf(“打开文件时出错。\n”);
返回-1;
}
//获取行数;从http://stackoverflow.com/a/3837983
而(fgets(buf_线、线尺寸、fp))
如果(!(strlen(buf_线)=LINESIZE-1和&buf_线[LINESIZE-2]!='\n'))
num_lines++;
//分配内存
arr_lines=(char*)malloc(num_lines*16*sizeof(char));
//读台词
倒带(fp);
num_行=0;
直线=arr_直线;
while(fgets(线条、线条尺寸、fp))
如果(!(strlen(line)==LINESIZE-1和line[LINESIZE-2]!='\n'))
行+=行大小;
//打印前四行
printf(“%s\n%s\n%s\n%s\n”、&arr_行[16*0]、&arr_行[16*1]、&arr_行[16*2]、&arr_行[16*3]);
//完成
fclose(fp);
返回0;
}

希望这有帮助

首先,不要强制转换malloc的结果,请参阅。其次,发布一个完整的最小编译程序,显示您遇到的问题。。。
#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;
}