另一个关于从初学者开始在C中打开的问题
我是C语言和编程的新手。我想写一个C程序,它将读取文本文件的内容并将其打印到控制台。我有一个名为test.txt的文本文件,其中包含字符串“Hi”。我创建了一个C程序用下面的代码:另一个关于从初学者开始在C中打开的问题
#include <stdio.h>
main()
{
FILE *myfile;
myfile=fopen("test.txt", "r");
printf("%s", myfile);
fclose(myfile);
}
这个程序编译OK(至少使用默认设置),但是当我运行该程序,字符串“嗨”不会出现。你能帮我看看我做错了什么吗?谢谢。
另外,你有任何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,转换为字符串时为1),如果已达到文件末尾,则返回EOF。格式字符串首先使用空格删除输入流中的所有前面的空格(换行符,空格,制表符)。
在scanf()函数中使用字段宽度说明符(80)意味着只有很多字符会被读取,所以输入不能超过分配的空间 - 非常有用!
[^]表示流只会被读取直到遇到指定的字符。 [^ \ n]是一种获取字符串空白的方式,因为scanf()系列通常只会读取字符串空白。请注意,换行符不会被删除(它仍然是流中的第一个)。
然后打印字符串,并添加一个换行符。该程序将遍历多达80行的文字(由换行符分隔)。如果你想保留这些行,你可以使字符串成为char数组的数组,并且每次都增加。这是fscanf()格式字符串中的第一个空格派上用场的地方,它将删除仍在流开头的换行符(以及任何其他前面的空格)。
我还没有找到任何学习C在线的权威教程,但有很多可用的。目前的标准是不是初学者友好的,但一个草案形式是免费提供:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
另一个很好的资源(但不是教程)是http://c-faq.com/
的标准库函数,我底细的最好的参考资料我发现是Harbison & Steele的C:参考手册 - 但不幸的是它不是免费的。
您正在尝试在该位置打印字符串由myfile
到控制台的价值指向。这显然是不正确的(如果你不知道为什么,这是因为%s
期望char*
,而不是FILE*
,并且FILE*
不指向该文件的内容)。
从文件中读取数据,使用fread
:
char buf[80] = {0}; // fill buf with NULLs
fread(buf, sizeof(char), 2, myfile); // read 2 bytes
如果您想将整个文件读入缓冲区,事情变得稍微有点复杂,因为你必须确定该文件的长度和然后在合适大小的堆上动态分配内存以保存该文件。 the fread
page at cplusplus.com有一个很好的教程。
读取一行,它会更有意义使用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, 0, 80);
fread(buf, sizeof(char), sizeof(char)*79, myfile);
printf("%s", buf);
}
fclose(myfile);
}
feof
检查以确保没有达到文件末尾。 memset
,将缓冲区中的所有内容都设置为0. fread
将从文件读取多达79个字符到缓冲区中。请注意,最大大小应该是79而不是80,即缓冲区的大小。这是因为数组中的最后一个点应该保留为空字符'\ 0',这表示C已经结束了字符串。请使用fgets
。此函数被认为是不安全的,因为它可能导致缓冲区溢出,其中字符被写入超过为字符串分配的内存空间。
如果您对编程一般都不熟悉,我会建议在学习C之前学习像Python这样的更适合初学者的语言。对于新程序员来说,C被认为是棘手的,因为它没有自动内存管理,面向对象编程功能或大型标准库。
根据定义,'sizeof(char)'是1。 – 2011-06-12 20:03:12
@Jon是的,你说得对,谢谢。 – 2011-06-12 20:06:17