C 读取文件并另存为矩阵
我有一个这样的文件:C 读取文件并另存为矩阵,c,arrays,C,Arrays,我有一个这样的文件: 1 100 2 200 3 300 4 400 1 我想将其保存为矩阵,如果没有第二个数字,我想保存NULL 我试图写程序,但它不能正常工作 #include<stdio.h> int main() { int k=0 ,i,j , arr[100][100]; FILE *in= fopen("file.txt","r"); char line[1000]; while(fgets(line,1000,in) !=NULL) k++; fgets(line
1 100
2 200
3 300
4 400
1
我想将其保存为矩阵,如果没有第二个数字,我想保存NULL
我试图写程序,但它不能正常工作
#include<stdio.h>
int main() {
int k=0 ,i,j , arr[100][100];
FILE *in= fopen("file.txt","r");
char line[1000];
while(fgets(line,1000,in) !=NULL) k++;
fgets(line,1000,in);
for (i=0;i<k;i++){
for (j=0;j<2;j++){
int tmp ;
fscanf(in ,"%d", &tmp) ;
arr[i][j] = tmp ;
}
}
fclose(in);
return 0; }
#包括
int main(){
int k=0,i,j,arr[100][100];
FILE*in=fopen(“FILE.txt”、“r”);
字符行[1000];
while(fgets(line,1000,in)!=NULL)k++;
fgets(线,1000,英寸);
对于(i=0;i两个主要问题:
第一个是第一个循环将读取所有行,甚至是一行中只有一个数字的行。这意味着孤独的fgets
调用不会做任何事情,更重要的是k
的值将是错误的
第二个问题是,一旦从文件中读取了所有数据,就不会返回到文件的开头,而是继续尝试从文件结尾以外的地方读取
第一个问题可以通过跳过第二个fgets
调用并将k
减少一个来解决
第二个问题可以通过在计算行数后调用来解决
另外,当你实际读取数字时,你不需要内部循环,只需执行例如
scanf("%d %d", &arr[i][0], &arr[i][1]);
实际上,您根本不需要第一个行计数循环,您可以在一个循环中完成这一切,方法是使用fgets
和sscanf
,然后检查sscanf
的返回值
#include <stdio.h>
int main(void)
{
int values[100][2];
FILE *input = fopen("file.txt", "r");
size_t entries = 0;
if (input != NULL)
{
char buffer[40];
while (fgets(buffer, sizeof(buffer), input) != NULL && entries < 100)
{
int res = sscanf(buffer, "%d %d", &values[entries][0], &values[entries][1]);
if (res <= 1 || res == EOF)
{
// Read the last line with only one number, or an error happened
values[entries][0] = 0;
values[entries][1] = 0;
break;
}
++entries;
}
if (ferror(input))
{
printf("Error reading file\n");
}
fclose(input);
}
// All done, the number of "records" or "entries" is in the variable entries
// Example code: print the values
for (size_t i = 0; i < entries; ++i)
printf("Line %d: %d %d\n", i + 1, values[i][0], values[i][1]);
return 0;
}
#包括
内部主(空)
{
整数值[100][2];
FILE*input=fopen(“FILE.txt”、“r”);
大小\u t条目=0;
如果(输入!=NULL)
{
字符缓冲区[40];
while(fgets(buffer,sizeof(buffer),input)!=NULL&&entries<100)
{
int res=sscanf(缓冲区,“%d%d”、&value[entries][0]、&value[entries][1]);
如果(res2个主要问题:
第一个是第一个循环将读取所有行,甚至是一行中只有一个数字的行。这意味着孤独的fgets
调用不会做任何事情,更重要的是k
的值将是错误的
第二个问题是,一旦从文件中读取了所有数据,就不会返回到文件的开头,而是继续尝试从文件结尾以外的地方读取
第一个问题可以通过跳过第二个fgets
调用并将k
减少一个来解决
第二个问题可以通过在计算行数后调用来解决
另外,当你实际读取数字时,你不需要内部循环,只需执行例如
scanf("%d %d", &arr[i][0], &arr[i][1]);
实际上,您根本不需要第一个行计数循环,您可以在一个循环中完成这一切,方法是使用fgets
和sscanf
,然后检查sscanf
的返回值
#include <stdio.h>
int main(void)
{
int values[100][2];
FILE *input = fopen("file.txt", "r");
size_t entries = 0;
if (input != NULL)
{
char buffer[40];
while (fgets(buffer, sizeof(buffer), input) != NULL && entries < 100)
{
int res = sscanf(buffer, "%d %d", &values[entries][0], &values[entries][1]);
if (res <= 1 || res == EOF)
{
// Read the last line with only one number, or an error happened
values[entries][0] = 0;
values[entries][1] = 0;
break;
}
++entries;
}
if (ferror(input))
{
printf("Error reading file\n");
}
fclose(input);
}
// All done, the number of "records" or "entries" is in the variable entries
// Example code: print the values
for (size_t i = 0; i < entries; ++i)
printf("Line %d: %d %d\n", i + 1, values[i][0], values[i][1]);
return 0;
}
#包括
内部主(空)
{
整数值[100][2];
FILE*input=fopen(“FILE.txt”、“r”);
大小\u t条目=0;
如果(输入!=NULL)
{
字符缓冲区[40];
while(fgets(buffer,sizeof(buffer),input)!=NULL&&entries<100)
{
int res=sscanf(缓冲区,“%d%d”、&value[entries][0]、&value[entries][1]);
如果(res),则无法将宏NULL
存储为整数。通常不应将其值存储为整数。您需要倒带
。并使用int**arr;
安装int arr[100][100]
不能将宏NULL
存储为整数。通常不应将其值存储为整数。您需要倒带
。并使用int**arr;
安装的int arr[100][100]
@iffřņtĞîRl更新了代码以处理sscanf
不返回2
。但您必须详细说明“用NULL记录1”的含义.NULL
是一个空指针,您不应该将其分配给整数变量。您应该自己好好想想,我真的不喜欢为您编写代码,这只会让您学习复制粘贴。我希望得到这样的输出矩阵:[1 100;2 200;3 300;4 400;1 NULL];但无论如何,我会尝试回答:小问题:为什么要使用if(res@iffřņtĞîRl更新代码来处理sscanf
而不是以不同方式返回2
。但您必须详细说明“用NULL记录1”是什么意思.NULL
是一个空指针,您不应该将其分配给整数变量。您应该自己好好想想,我真的不喜欢为您编写代码,这只会让您学习复制粘贴。我希望得到这样的输出矩阵:[1 100;2 200;3 300;4 400;1 NULL];但无论如何,我会尝试回答:小问题:为什么要使用if(res