在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: