从文件中读取句子

时间:2014-05-09 00:34:11

标签: c string file char

字符串让我发疯。这就像没有buit-in功能是有用的。

我想做的就是这个。我有这个文件f:

1
I like fries
2
Do you like fries?
3
I like trains. 

我怎样才能读完整个句子"我喜欢薯条"从文件?到目前为止,没有什么对我有用。我不知道这句话有多长,我正在阅读/保存句子的变量是char *Blaa;

好的编辑因为这让我发疯了

我有这个

     typedef struct Student
{
int nrcrt;
char *name;
} Student;
Student *S;

  void Readstuff()
{
FILE *f;
int i;
f = fopen("students.txt","r");
if (!f)
{
    perror("can't open file.\n"); exit(EXIT_FAILURE);
}
char line[4096];
for(i=0;i<N;i++)
{

   fscanf(f,"%d",&S[i].nrcrt);
   printf("%d\n",S[i].nrcrt);
   while (fgets(line,sizeof(line),f) != 0)
    {
       strcpy(S[i].name,line);
    }
}
close(f);
}

我可以读入S [i] .nrcrt,但如果我想读取一个字符串并将其放入S [i] .name中,整个宇宙就会爆炸。我一直在分段错误。我试图在变量line中读取一行,然后将其复制到S[i].name但没有。

为了争论,我们假装学生的名字可以是#34;我喜欢薯条&#34;。我不想让这个问题过于复杂,所以这就是为什么我没有真正说出我需要的东西。

1 个答案:

答案 0 :(得分:0)

解决修正后的问题

你有:

typedef struct Student
{
    int nrcrt;
    char *name;
} Student;
Student *S;

您不会显示分配Student结构数组或存储名称空间的任何代码。在C中,您始终必须确保指针指向某些内容 - 并且使用您已显示的数据结构,您需要管理Students的动态数组,并且每个{ {1}},您必须动态分配其名称。通过动态内存管理,您还必须确保释放已分配的内存。

分配名称的最简单方法是使用POSIX函数strdup()

Student

关于在C中管理动态结构数组,您可以找到关于SO的无数其他问题。或者您可以通过使用以下方式完全解决问题:

S[i].name = strdup(line);

除非您有理由为阵列进行动态内存分配,否则请使用它。如果您更改了结构,也可以避免Student S[MAX_STUDENTS];

strdup()

原始答案

有各种选择。你在一行上显示句子;这很容易。句子可以分布在多行文本中吗?

听起来您的一个问题是,您尚未对typedef struct Student { int nrcrt; char name[MAX_NAME_LEN]; } Student; 指出任何数据。

您可以使用Blaa

fgets()

如果您需要处理多行句子,那么您需要准备好从多行构建句子。你的句子长度有上限吗?您不太可能发现许多使用超过4 KiB数据的句子,因此您可能只是将句子的连续行读入单个char line[4096]; while (fgets(line, sizeof(line), stdin) != 0) { …process line (sentence)… } 缓冲区。

line

如果你不能在句子大小上设置一个合理的上限,那么你将不得不逐句建立句子,将行读入char line[4096]; char *buffer = line; size_t buflen = sizeof(line); while (fgets(buffer, buflen, stdin) != 0) { if (isdigit((unsigned char)buffer[0])) { *buffer = '\0'; …process sentence in line… buffer = line; buflen = sizeof(line); } else { size_t newline = strlen(buffer); buffer += newline; buflen -= newline; } } if (buffer != line) { …process sentence in line… } 然后将其复制到一个动态增长的数组中(创建使用linemalloc(),最终由realloc()发布。