Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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 - Fatal编程技术网

在C语言中读取文本文件,复制到数组中

在C语言中读取文本文件,复制到数组中,c,arrays,C,Arrays,代码应该读取用户输入的文本文件名,将每个字符复制到多维数组中,然后以标准输出显示。它会编译,但会生成无法理解的文本。我错过什么了吗 for (i = 0; i < BIGGEST; i++) { for (j = 0; j < BIGGESTL; j++) { if (fgetc(array, fp) ) != EOF) array[i][j] = c; else array[i]

代码应该读取用户输入的文本文件名,将每个字符复制到多维数组中,然后以标准输出显示。它会编译,但会生成无法理解的文本。我错过什么了吗

    for (i = 0; i < BIGGEST; i++) {
        for (j = 0; j < BIGGESTL; j++) {
            if (fgetc(array, fp) ) != EOF)
                array[i][j] = c;
            else array[i][j] = '\0'


        }

    fclose(fp);    
    return 0;
}
for(i=0;i
当遇到EOF时,您停止填充数组,但无论如何都会打印出完整的数组

如果从文件中读取的数据小于输入数组,则将读入该数据,然后打印出该数据,以及内存位置中不使用文件中的数据覆盖的任意随机字符


由于要求似乎是打印文本数据,您可以在数组中插入一个特殊标记(例如“\0”),以指示遇到EOF的位置,并在到达该标记时停止显示数据。

最好从文件中读取每一行

例如:

int i = 0;
while(fgets(text[i],1000,fp))
{
    i++;
}

尽管问题已被编辑,只剩下部分代码存在问题。我现在发布的内容超过了这个问题的要求。 原因是,对最初发布的完整代码可以有很多改进

main()
函数中:

您需要检查
argc
值是否等于
2
,然后才能读入
argv[1]
的值。否则,如果程序在没有命令行参数(在本例中为文件名)的情况下执行,则会发生无效内存读取,如果您在
argv[1]
中读取,则会导致分段错误

read\u file\u和\u show\u中显示内容()
函数:

如果达到文件结尾或读取了最大字符数并存储在字符数组中,则停止读取文件

以下程序将帮助您可视化:

#include <stdio.h>

/*Max number of characters to be read/write from file*/
#define MAX_CHAR_FOR_FILE_OPERATION 1000000 

int read_and_show_the_file(char *filename)
{  
   FILE *fp;
   char text[MAX_CHAR_FOR_FILE_OPERATION];
   int i;

   fp = fopen(filename, "r");

   if(fp == NULL)
   {
      printf("File Pointer is invalid\n");
      return -1;
   }
   //Ensure array write starts from beginning
   i = 0;

   //Read over file contents until either EOF is reached or maximum characters is read and store in character array
   while( (fgets(&text[i++],sizeof(char)+1,fp) != NULL) && (i<MAX_CHAR_FOR_FILE_OPERATION) ) ;

   //Ensure array read starts from beginning
   i = 0;

   while((text[i] != '\0') && (i<MAX_CHAR_FOR_FILE_OPERATION) )
   {
      printf("%c",text[i++]);
   }

   fclose(fp);

   return 0;
}

int main(int argc, char *argv[])
{
   if(argc != 2)
   {
      printf("Execute the program along with file name to be read and printed. \n\
              \rFormat : \"%s <file-name>\"\n",argv[0]);
      return -1;
   }

   char *filename = argv[1];

   if( (read_and_show_the_file(filename)) == 0)
   {
      printf("File Read and Print to stdout is successful\n");
   }
   return 0;
}  
#包括
/*要从文件读取/写入的最大字符数*/
#为\u文件\u操作定义最大\u字符\u 1000000
int read和显示文件(char*filename)
{  
文件*fp;
字符文本[用于文件操作的最大字符数];
int i;
fp=fopen(文件名,“r”);
如果(fp==NULL)
{
printf(“文件指针无效\n”);
返回-1;
}
//确保数组写入从头开始
i=0;
//读取文件内容,直到达到EOF或读取最大字符并存储在字符数组中

而((fgets(&text[i++],sizeof(char)+1,fp)!=NULL)&&(我也会检查您是否超过平台和/或编译器设置的最大堆栈大小。您分配了近1MB的内存。对于VS,默认堆栈大小似乎为1MB: