Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_String_File Io - Fatal编程技术网

C 将每行文件读入数组

C 将每行文件读入数组,c,arrays,string,file-io,C,Arrays,String,File Io,我正在读取一个文件,希望将每一行放入数组中的字符串中。文件的长度是任意的,每行的长度是任意的(尽管假定它少于100个字符) 这是我得到的,它不是编译的。本质上这是一个数组到一个字符数组,对吗?所以它不应该是char**words=(**char)malloc(sizeof(*char)) #包括 #包括 int main(){ int BUFSIZE=32767;//要读取的最大行数 char**words=(**char)malloc(sizeof(*char));//给出错误:“char”前

我正在读取一个文件,希望将每一行放入数组中的字符串中。文件的长度是任意的,每行的长度是任意的(尽管假定它少于100个字符)

这是我得到的,它不是编译的。本质上这是一个数组到一个字符数组,对吗?所以它不应该是
char**words=(**char)malloc(sizeof(*char))

#包括
#包括
int main(){
int BUFSIZE=32767;//要读取的最大行数
char**words=(**char)malloc(sizeof(*char));//给出错误:“char”前面应该有表达式
文件*fp=fopen(“coll.txt”,“r”);
如果(fp==0){
fprintf(stderr,“打开文件时出错”);
出口(1);
}
int i=0;
字[i]=malloc(BUFSIZE);
而(fscanf(fp,“%100s”,words[i])==1)//任何行的长度都不会超过100
{
i++;
字[i]=realloc(字,大小(字符*)*i);
}
int j;
对于(j=0;j

注意:我读过“”,但它没有回答我的问题。

您的程序有一些问题。realloc()语句未正确使用。我也更喜欢fgets()来获取一条线。这是我的解决办法。这还使用realloc()来增加缓冲行的分配,这样您既不必事先知道行数,也不必分两次读取文件(这样会更快)。当您不知道需要预先分配多少内存时,这是一种常用的技术

#include <stdio.h>
#include <stdlib.h>

int main(void)

    {
    int lines_allocated = 128;
    int max_line_len = 100;

    /* Allocate lines of text */
    char **words = (char **)malloc(sizeof(char*)*lines_allocated);
    if (words==NULL)
        {
        fprintf(stderr,"Out of memory (1).\n");
        exit(1);
        }

    FILE *fp = fopen("coll.txt", "r");
    if (fp == NULL)
        {
        fprintf(stderr,"Error opening file.\n");
        exit(2);
        }

    int i;
    for (i=0;1;i++)
        {
        int j;

        /* Have we gone over our line allocation? */
        if (i >= lines_allocated)
            {
            int new_size;

            /* Double our allocation and re-allocate */
            new_size = lines_allocated*2;
            words = (char **)realloc(words,sizeof(char*)*new_size);
            if (words==NULL)
                {
                fprintf(stderr,"Out of memory.\n");
                exit(3);
                }
            lines_allocated = new_size;
            }
        /* Allocate space for the next line */
        words[i] = malloc(max_line_len);
        if (words[i]==NULL)
            {
            fprintf(stderr,"Out of memory (3).\n");
            exit(4);
            }
        if (fgets(words[i],max_line_len-1,fp)==NULL)
            break;

        /* Get rid of CR or LF at end of line */
        for (j=strlen(words[i])-1;j>=0 && (words[i][j]=='\n' || words[i][j]=='\r');j--)
            ;
        words[i][j+1]='\0';
        }
    /* Close file */
    fclose(fp);

    int j;
    for(j = 0; j < i; j++)
        printf("%s\n", words[j]);

    /* Good practice to free memory */
    for (;i>=0;i--)
        free(words[i]);
    free(words);
    return 0;
    }
#包括
#包括
内部主(空)
{
分配的整数行=128;
int max_line_len=100;
/*分配文本行*/
char**words=(char**)malloc(sizeof(char*)*已分配的行);
if(words==NULL)
{
fprintf(stderr,“内存不足(1)。\n”);
出口(1);
}
文件*fp=fopen(“coll.txt”,“r”);
如果(fp==NULL)
{
fprintf(stderr,“打开文件时出错。\n”);
出口(2);
}
int i;
对于(i=0;1;i++)
{
int j;
/*我们检查过我们的线路分配了吗*/
如果(i>=已分配的行)
{
int新尺寸;
/*加倍分配并重新分配*/
新大小=分配的行数*2;
words=(char**)realloc(words,sizeof(char*)*新大小);
if(words==NULL)
{
fprintf(stderr,“内存不足”。\n”);
出口(3);
}
已分配的行数=新的行数;
}
/*为下一行分配空间*/
字[i]=malloc(max_line_len);
如果(字[i]==NULL)
{
fprintf(stderr,“内存不足(3)。\n”);
出口(4);
}
if(fgets(字[i],最大线长度-1,fp)=NULL)
打破
/*在生产线的末端去除CR或LF*/
对于(j=strlen(单词[i])-1;j>=0&&(单词[i][j]='\n'| |单词[i][j]='\r');j--)
;
字[i][j+1]='\0';
}
/*关闭文件*/
fclose(fp);
int j;
对于(j=0;j=0;i--)
自由(字[i]);
免费(字);
返回0;
}

您应该更改行:

char** words = (**char)malloc(sizeof(*char));
为此:

char** words=(char **)malloc(sizeof(char *)*Max_Lines);

它应该是char*。。。您正在尝试查找字符指针的大小…请注意,
%100s
将(a)跳过前导空格并停止读取非空格字符后的空格,以及(b)将使大小为100的缓冲区溢出一个字节,这可能很重要。您必须指定一个小于转换规范中数组大小的值。+1。我强烈建议将
for
循环的主体分号单独放在一行上。当附加到右括号后的同一行时,它很容易被误认为是打字错误,或者被忽略。名义上,您可以在一行中包含多个
'\r'
字符;这可能很重要(但更可能不会)。@JonathanLeffler——我落实了你的建议。谢谢。@willus您是如何决定分配的
int行数的值128的?@Celeritas--好问题。有点随意。您希望选择一个数字,该数字不会太大,以至于您最初过度分配内存,但也不会太小,以至于导致大量realloc调用。您只分配一个指针数组,因此可以从更大的值开始。2乘数的系数也可以调整。我已经看过1.5版了。这在一定程度上取决于你认为你的典型案例会是什么。如果你真的愿意,你可以对不同情况下的内存使用和运行时间进行研究,以优化这些值,但性能的变化可能很小。回答得好!从行尾删除
\n
和/或
\r
的for循环将一个字符删除为多个字符,将
\0
放在非换行符的字符串的最后一个字符处(从而截断最后一个字符)。您可能应该将
单词[i][j]
更改为
单词[i][j+1]
。另外,使用
fclose()
关闭打开的文件也是一个好习惯。
char** words=(char **)malloc(sizeof(char *)*Max_Lines);