C语言从文件中读取信息
Reading information from a file in C language
所以我有 txt 文件,我需要从中读取该文件中写入的学生人数,并且因为每个学生都在单独的行中,这意味着我需要读取该文件中的行数。所以我需要:
打印该文档中的所有行
写下该文档的行数。
所以,我这样写:
#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* Argo[]){
FILE *student;
char brst[255];
student = fopen("student.txt", "r");
while(what kind of condition to put here?)
{
fgetc(brst, 255, (FILE*)student);
printf("%s\n", brst);
}
return 0;
}
好的,我知道我可以使用相同的循环来打印和计算行数,但是我找不到任何工作规则来结束循环。我尝试的每条规则都会导致死循环。我尝试了 brst != EOF
、brst != [=12=]
。所以,它工作正常并打印文档的所有元素,然后它开始打印文档的最后一行,没有结束。那么有什么建议吗?我需要用C语言做这个作业,我正在使用VS 2012 C++
编译器。
使用 feof() 检查 eof 条件。
您正在逐行正确读取文件,但使用 fgets() 而不是 fgetc() - 并且不需要强制转换。
然后使用 sscanf() 将行数据分配给变量(或它的某些 "safe" 形式)。
试试这个:
#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* Argo[]){
FILE *student;
char brst[255];
char* result = NULL;
//Ensure file open works, if it doesn't quit
if ((student = fopen("student.txt", "r")) == NULL)
{
printf("Failed to load file\n");
return 1;
}
//Read in the file
for ( (result = fgets( brst, sizeof(brst), student));
!feof(student);
(result = fgets( brst, sizeof(brst), student)) )
{
if ( result == NULL ) break; //I've worked on embedded systems where this actually ment waiting on data, not EOF, so a 'continue' would go here instead of break in that case
printf("%s\n", brst);
}
fclose( student );
return 0;
}
feof() 只有在您读完文件末尾后才为真。使用具有两个相同读取的 for 和条件上的 feof() 是确保您按预期读取文件的简单方法。
OP 的代码很接近,但需要使用 fgets()
而不是 fgetc()
并使用 fgets()
的 return 值来检测何时退出,它将是 NULL
。还要添加一个行计数器。
#include <stdio.h>
int main(void) {
FILE *student = fopen("student.txt", "r");
unsigned line_count = 0;
if (student) {
char brst[255];
// fgetc(brst, 255, (FILE*)student);
while (fgets(brst, sizeof brst, student)) {
line_count++;
printf("%u %s", line_count, brst);
}
fclose(student);
}
printf("Line Count %u\n", line_count);
return 0;
}
所以我有 txt 文件,我需要从中读取该文件中写入的学生人数,并且因为每个学生都在单独的行中,这意味着我需要读取该文件中的行数。所以我需要:
打印该文档中的所有行
写下该文档的行数。
所以,我这样写:
#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* Argo[]){
FILE *student;
char brst[255];
student = fopen("student.txt", "r");
while(what kind of condition to put here?)
{
fgetc(brst, 255, (FILE*)student);
printf("%s\n", brst);
}
return 0;
}
好的,我知道我可以使用相同的循环来打印和计算行数,但是我找不到任何工作规则来结束循环。我尝试的每条规则都会导致死循环。我尝试了 brst != EOF
、brst != [=12=]
。所以,它工作正常并打印文档的所有元素,然后它开始打印文档的最后一行,没有结束。那么有什么建议吗?我需要用C语言做这个作业,我正在使用VS 2012 C++
编译器。
使用 feof() 检查 eof 条件。 您正在逐行正确读取文件,但使用 fgets() 而不是 fgetc() - 并且不需要强制转换。 然后使用 sscanf() 将行数据分配给变量(或它的某些 "safe" 形式)。
试试这个:
#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* Argo[]){
FILE *student;
char brst[255];
char* result = NULL;
//Ensure file open works, if it doesn't quit
if ((student = fopen("student.txt", "r")) == NULL)
{
printf("Failed to load file\n");
return 1;
}
//Read in the file
for ( (result = fgets( brst, sizeof(brst), student));
!feof(student);
(result = fgets( brst, sizeof(brst), student)) )
{
if ( result == NULL ) break; //I've worked on embedded systems where this actually ment waiting on data, not EOF, so a 'continue' would go here instead of break in that case
printf("%s\n", brst);
}
fclose( student );
return 0;
}
feof() 只有在您读完文件末尾后才为真。使用具有两个相同读取的 for 和条件上的 feof() 是确保您按预期读取文件的简单方法。
OP 的代码很接近,但需要使用 fgets()
而不是 fgetc()
并使用 fgets()
的 return 值来检测何时退出,它将是 NULL
#include <stdio.h>
int main(void) {
FILE *student = fopen("student.txt", "r");
unsigned line_count = 0;
if (student) {
char brst[255];
// fgetc(brst, 255, (FILE*)student);
while (fgets(brst, sizeof brst, student)) {
line_count++;
printf("%u %s", line_count, brst);
}
fclose(student);
}
printf("Line Count %u\n", line_count);
return 0;
}