Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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,我是C语言的新手,正在努力完成一项作业。程序应将文件名作为命令行参数,然后打印文件内容。我的程序打印混乱的文本,而不是文件中的实际文本 我已经在互联网上搜索了我的问题的示例/答案,但仍然被卡住了 我做错了什么?。如果可以,请修改我的代码,而不是编写新的代码,这样我将有一个更容易理解的时间 int main() { char fileName[20]; int *buffer; int size; // ask for file name and take inp

我是C语言的新手,正在努力完成一项作业。程序应将文件名作为命令行参数,然后打印文件内容。我的程序打印混乱的文本,而不是文件中的实际文本

我已经在互联网上搜索了我的问题的示例/答案,但仍然被卡住了

我做错了什么?。如果可以,请修改我的代码,而不是编写新的代码,这样我将有一个更容易理解的时间

int main()
{
    char fileName[20];
    int *buffer;
    int size;

    // ask for file name and take input.
    printf("Enter file name: ");            
    scanf("%s", fileName);

    // open file in read mode.
    FILE *fp;
    fp = fopen(fileName, "r");          

    // If no file, show error.
    if(fp == NULL)                  
    {
        printf("Error: Can't open file.\n");        
        return 1;
    }

    // count characters in file with fseek and put into size, then move the
    // position of the file back to the beginning.
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    rewind(fp);

    // allocate buffer and read file into buffer.
    buffer = malloc(size+1);
    fread(buffer, 1, size, fp);

    // close the file.
    fclose(fp);

    // for loop reading array one character at a time.
    for(int x = 0; x < size; x++)
    {               
        printf("%c", buffer[x]);
    }

    return 0;
}
intmain()
{
字符文件名[20];
int*缓冲区;
整数大小;
//询问文件名并接受输入。
printf(“输入文件名:”);
scanf(“%s”,文件名);
//以读取模式打开文件。
文件*fp;
fp=fopen(文件名,“r”);
//如果没有文件,则显示错误。
如果(fp==NULL)
{
printf(“错误:无法打开文件。\n”);
返回1;
}
//使用fseek计算文件中的字符数并放入大小,然后移动
//将文件放回起始位置。
fseek(fp,0,SEEK_END);
尺寸=ftell(fp);
倒带(fp);
//分配缓冲区并将文件读入缓冲区。
缓冲区=malloc(大小+1);
fread(缓冲区,1,大小,fp);
//关闭文件。
fclose(fp);
//对于循环读取数组,一次读取一个字符。
用于(int x=0;x
您在读取字符时使用了错误的数据类型,即您使用了
int*buffer
,但您应该使用
char*buffer


使用
int*buffer
时,像
printf(“%c”,buffer[x])
这样的访问将以整数数组的形式访问缓冲区;整数的大小可能是
4
,因此
buffer[1]
会寻址缓冲区中的第4个字节,
buffer[2]
第8个字节,依此类推。。。因此,您将读取不再包含在文件中的元素,实际上超出了数组边界(导致垃圾或其他内容)。

您在读取字符时使用了错误的数据类型,即使用
int*buffer
,但应使用
char*buffer


使用
int*buffer
时,像
printf(“%c”,buffer[x])
这样的访问将以整数数组的形式访问缓冲区;整数的大小可能是
4
,因此
buffer[1]
会寻址缓冲区中的第4个字节,
buffer[2]
第8个字节,依此类推。。。因此,您将读取不再包含在文件中的元素,实际上超出了数组边界(导致垃圾或其他情况)。

始终要警惕缓冲区溢出。20个字符的缓冲区非常小。如果编译代码出现故障,请打开调试器。
int*buffer
->
char*buffer
x
:使用
fread
的返回值,而不是
size
。实际读取的字符数可能不同。请始终小心缓冲区溢出。20个字符的缓冲区非常小。如果编译代码出现故障,请打开调试器。
int*buffer
->
char*buffer
x
:使用
fread
的返回值,而不是
size
。实际读取的字符数可能不同。