【发布时间】:2019-08-15 23:00:31
【问题描述】:
我正在编写一个 C 程序,它将打开一个文件,写入文件,然后读取写入的内容。我可以打开、写入和关闭文件,但我无法读取这些行并正确解析它们。
我阅读了许多其他博客和网站,但没有一个能够完全解决我想要做的事情。我试过调整他们的一般解决方案,但我从来没有得到我想要的行为。我已经用 fgets()、gets()、strtok()、scanf() 和 fscanf() 运行了这段代码。我使用了 strtok_r() ,因为它被推荐为最佳实践。我使用 gets() 和 scanf() 作为实验来查看它们的输出,而不是 fgets() 和 fscanf()。
我想做什么:
- get first line // 第一行是一串空格分隔的 ints "1 2 3 4 5"
- 解析这一行,将每个字符数转换为整数
- 将其存储到一个数组中。
- 获取下一行并重复直到 EOF
谁能告诉我我缺少什么以及哪些功能被认为是最佳实践?
谢谢
我的代码:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(){
FILE * file;
// read data from customer.txt
char lines[30];
file = fopen("data.txt", "r");
// data.txt currently holds five lines
// 1 1 1 1 1
// 2 2 2 2 2
// 3 3 3 3 3
// 4 4 4 4 4
// 5 5 5 5 5
char *number;
char *next = lines;
int s = 0;
int t = 0;
int num;
int prams[30][30];
while(fgets(lines, 30, file)){
char *from = next;
while((number = strtok_r(from, " ", &next)) != NULL){
int i = atoi(number);
prams[t][s] = i;
printf("this is prams[%d][%d]: %d\n", t, s, prams[t][s]);
s++;
from = NULL;
}
t++;
}
fclose(file);
}// main
预期输出:
这是婴儿车[0][0]:1
...
这是婴儿车[4][4]: 5
实际输出:
这是婴儿车[0][0]:1
这是婴儿车[0][1]: 1
这是婴儿车[0][2]: 1
这是婴儿车[0][3]: 1
这是婴儿车[0][4]: 1
节目结束
【问题讨论】:
-
@EugeneSh。这只是标准评论还是在这种情况下实际上是对问题的解释?
-
请参阅How to use
sscanf()in loops,了解如何解析带有sscanf()的行。外环控制使用while (fgets(lines, 30, file));不要使用feof(),除非(可能)在循环终止后区分 EOF 和 I/O 错误。 -
@Yunnosch 这个问题的答案应该可以帮助这个问题的作者
-
@Yunnosch 一种标准。但是一旦我看到一个问题,我就会产生一种“由于以前的错误而停止阅读”的状态:)