初学者有关C语言中fopen的另一个问题

问题描述

我是C和一般编程人员的新手。我想编写一个C程序,该程序将读取文本文件的内容并将其打印到控制台。我有一个名为test.txt的文本文件,其中包含字符串“ Hi”。我用以下代码创建了一个C程序:
#include <stdio.h>

main()
{
  FILE *myfile;
  myfile=fopen(\"test.txt\",\"r\");
  printf(\"%s\",myfile);
  fclose(myfile);
}
该程序可以编译OK(至少使用默认设置),但是当我运行该程序时,不会出现字符串“ Hi”。您能帮我看看我在做什么错吗?谢谢。 另外,您有没有推荐的C参考网站?我正在寻找一个包含C语言规范的网站,也许其中包括有关如何使用库函数的示例。 非常感谢您的宝贵时间。 安德鲁 卡内基·梅隆大学     

解决方法

        问题是您试图打印FILE指针而不是文件内容-您需要一个变量来存储它。 看到其他方法很有趣。这是fscanf()的实现-
#include <stdio.h>
#define FILENAME \"test.txt\"

int main(void)
{
    FILE *myfile;
    char string[81] = {\'\\0\'};

    myfile=fopen(FILENAME,\"r\");
    if(myfile == NULL)
    {
        printf(\"The file test.txt could not be found! Exiting...\\n\");
        return -1;
    }
    while(fscanf(myfile,\" %80[^\\n]s\",string) != EOF)
    {
        printf(\"%s\\n\",string);
    }
    fclose(myfile);

    return 0;
}
当您打开文件时,如果操作失败,则将返回NULL,因此,最好进行显式检查,以使您知道出了什么问题。 fscanf()返回成功读取的次数(此处为1,表示一次转换为字符串),如果已到达文件末尾,则返回EOF。格式字符串首先使用空格删除输入流中的所有空格(换行符,空格,制表符)。 在scanf()函数中使用字段宽度说明符(80)意味着仅读取这么多字符,因此输入不能超出分配的空间-有用! [^]表示将仅在遇到指定字符之前读取流。 [^ \\ n]是一种获取其中带有空格的字符串的方法,因为scanf()系列通常仅读取遇到字符串的空格。请注意,换行符不会被删除(它仍然是流中的第一行)。 然后打印字符串,并添加换行符。该程序将循环遍历文件中的许多行(最多80个字符,用换行符分隔)。如果要保留行,可以将string组成char数组,并每次增加。这是fscanf()格式字符串中的第一个空格派上用场的地方,它将删除仍位于流的开头的换行符(以及其他任何前面的空格)。 我没有找到任何在线学习C的权威教程,但是有很多可用的。当前标准不适用于初学者,但可以免费提供草稿表格:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 另一个很好的资源(但不是教程)是http://c-faq.com/ 我发现的关于标准库功能的最佳参考是Harbison&Steele的C:A参考手册-不幸的是,它不是免费的。     ,        您试图在控制台上将值
myfile
指向的位置打印字符串。那显然是不正确的(如果您不知道为什么,那是因为
%s
期望a4ѭ,而不是
FILE*
,而
FILE*
则不指向文件的内容。)。 要从文件中读取数据,请使用
fread
char buf[80] = {0}; // fill buf with NULLs
fread(buf,sizeof(char),2,myfile); // read 2 bytes 
如果要将整个文件读入缓冲区,则需要花些时间,因为必须确定文件的长度,然后在适当大小的堆上动态分配内存以容纳文件。在cplusplus.com的
fread
页面上有一个很好的教程。     ,        这是因为您不读取文件。要读取文件,可以使用fread或fgets方法     ,        要读取一行,使用
fgets
更为有意义,因为它会读取行终止符(
\\n
)。
char line[256]
fgets(line,sizeof(line),file);
printf(\"%s\",line);
    ,这是最安全的方法。
#include <stdio.h>
#include <string.h>

main()
{
  FILE *myfile;
  char buf[80];
  myfile=fopen(\"test.txt\",\"r\");
  while(!feof(myfile)){
    memset(buf,80);
    fread(buf,sizeof(char)*79,myfile);
    printf(\"%s\",buf);
  }
  fclose(myfile);
}
feof
检查以确保未到达文件末尾。
memset
,将缓冲区中的所有内容都设为0。
fread
将从文件中读取最多79个字符到缓冲区中。请注意,最大大小应为79,而不是缓冲区的大小80。这是因为数组中的最后一点应保留给空字符\'\\ 0 \',这向C指示字符串已结束。 请勿使用
fgets
。该函数被认为是不安全的,因为它可能导致缓冲区溢出,在这种情况下,字符被写入为该字符串分配的存储空间之外。 如果您一般不熟悉编程,我建议您在学习C之前学习一种更适合初学者的语言,例如Python。对于新程序员来说,C被认为是棘手的,因为它没有自动内存管理,面向对象的编程功能或大型标准库。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...