代码应该读取用户输入的文本文件名,将每个字符复制到多维数组中,然后使用标准输出显示它。它编译,但产生难以理解的文本。我错过了什么吗?
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;
}
答案 0 :(得分:2)
当您遇到EOF时,您会停止填充阵列,但无论如何都会打印出完整的阵列。
如果从文件读取的数据小于输入数组,您将读入该数据,然后打印出该数据,以及内存位置中的任何随机字符,您不会使用该文件中的数据覆盖这些字符。
由于要求似乎是打印文本数据,您可以在数组中插入一个特殊标记(例如'\ 0')来指示您遇到EOF的位置,并在到达该标记时停止显示数据。 / p>
答案 1 :(得分:0)
你最好从文件中读取每一行
例如:
int i = 0;
while(fgets(text[i],1000,fp))
{
i++;
}
答案 2 :(得分:0)
虽然问题已经过编辑,但只有部分代码存在问题。我发布的内容超过了目前问题的要求。 原因是,最初发布的完整代码可以有很多改进。
在main()
函数中:
为了您的目的,您需要检查argc
值是否等于2
,然后才能读取argv[1]
的值。否则,如果在没有命令行参数的情况下执行程序,在这种情况下是file_name,则会发生无效的内存读取,如果您在argv[1]
中读取,则会导致分段错误。
在read_file_and_show_the contents()
函数中:
如果到达文件末尾或读取最大字符并存储在字符数组中,则停止读取文件。
以下程序将帮助您实现可视化:
#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;
}