gpt4 book ai didi

c - 将文件中的字符数组读取到二维数组中

转载 作者:行者123 更新时间:2023-11-30 20:40:16 24 4
gpt4 key购买 nike

当我尝试从包含 10 个方程的文件中将方程(例如 3 +5/6)读入二维数组时,我在使用以下方法时遇到了麻烦。

int count=1;
void read(){
int i;
int j;
FILE *file = fopen("C:\\Users\\Sara\\Desktop\\Project2\\input", "r");

if(file == NULL){
printf("Unable to open file");
}else{
while(!feof(file)){
for (i=0; i <=20; i++){
for (j=0;j<=100;j++){
if (fscanf(file,"%c", &array[i][j]) < 1) break;
printf("Equation %d : %s \n", count, array[i]);
count++;
}
}
}
}
fclose(file);
}

最佳答案

您的代码存在一些问题:

  • 您没有显示数组是如何定义的,但我假设它是 array[20][100] 。有效 inices 分别为 0 到 19 和 0 到 100,上限在 C 中是不包括的。你的循环看起来像 (i = 0; i <= 20; i++)并包含该边界,因此可能会解决非法数组索引 20 和 100。

  • 文本文件包含非零字符。换行符由 ASCII 代码 10 的换行符表示,在 C 中可以写为 '\n' .

  • C 中的字符串是 char 的数组以空字符终止。你永远不会终止你的字符串。几乎所有标准字符串例程都要求字符串以零结尾,因此在使用数组调用它们时不会产生所需的结果。 (您还需要记住为终止空字符留出空间。)

  • 同时fscanf(file, "%c", &c)可用于读取单个字符,标准字符读取功能c = getc(file)开销更少,乍一看更容易理解。

  • for当数组的长度已知时,通常使用循环。您不知道有多少个方程以及每个方程有多长。一个while循环可能会更好。

  • 我猜是你count变量对方程进行计数。因为您在内循环中增加了它,所以您可以计算读取的字符总数。

  • 您一遍又一遍地阅读并覆盖这些行,因为您检查 feof外循环:读取20行;请注意,文件尚未到达末尾;尝试将 20 行以上的内容读入相同的数据,依此类推。 (建议:不要使用 feof ;它通常不会执行您想要的操作。相反,请检查读取函数的返回值。例如,如果文件末尾是 fscanf 将返回 EOF找到了。)

  • 小问题:打印错误消息时,应该将它们打印到 stderr 。另外,请务必使用换行符终止它们,以便打印整齐。在消息中包含文件名也是一个好主意。

将所有这些放在一起:

int read(const char *fn)
{
int i, j;
FILE *file = fopen(fn, "r");

if (file == NULL) {
fprintf(stderr, "Unable to open file %s.\n", fn);
return -1;
}

i = 0;
j = 0;

while (i < 20) {
int c = getc(file);

if (c == EOF) {
/* End of file: stop reading */
array[i][j] = '\0';
break;
}

if (c == '\n') {
/* New line: Begin new line and reset column counter */
array[i][j] = '\0';
j = 0;
i++;
} else {
if (j < 100 - 1) array[i][j++] = c;
}
}

fclose(file);
return i;
}

此函数将文件名作为参数并返回已读取的方程数。当文件无法打开时,它返回特殊值-1。然而,它读入具有硬编码大小的全局数组。

关于c - 将文件中的字符数组读取到二维数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23424915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com