所以我試圖將文本檔案中給出的一些資料決議為 C 程式。文本檔案包括:
4 4
1 1 0 0
1 1 0 0
0 0 1 1
0 0 1 1
前兩個數字是二維陣列存盤整數所需的行數和長度。到目前為止,我的代碼是:
file = fopen(argv[1], "r");
if (file == NULL)
{
perror("File IO error\n");
}
else
{
while(fgets(line, sizeof(line), file) != NULL)
{
if(sscanf(line, "%d %d %d %d", &a, &b, &c, &d) == 4)
{
printf("%d %d %d %d\n", a, b, c, d);
}
else
{
sscanf(line, "%d %d", &ROW, &COL);
printf("ROW: %d COL: %d\n", ROW, COL);
}
我遇到的問題是需要輸入其他文本檔案。它們與上面的行和列不同。例如:
15 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0 1 0 0 0 0 1 0
0 1 0 0 0 0 1 0 1 0 0 0 0 1 0
0 1 0 0 0 0 1 0 1 0 0 0 0 1 0
0 0 0 1 1 1 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 1 1 1 0 0 0
0 1 0 0 0 0 1 0 1 0 0 0 0 1 0
0 1 0 0 0 0 1 0 1 0 0 0 0 1 0
0 1 0 0 0 0 1 0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
由于我的代碼每行僅適用于 4 個整數,因此它不適用于更大或更小的檔案。我將如何使其動態并根據大小進行決議。謝謝
uj5u.com熱心網友回復:
如果您的文本檔案已格式化。你可以使用strtok和strtol
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int main() {
char payload[] = {"1 2 3 4"};
char *token = strtok(payload, " ");
while (token) {
int v = (int)strtol(token,NULL,10);
printf("%d\n",v);
token = strtok(NULL, " ");
}
return 0;
}
uj5u.com熱心網友回復:
您可以像這樣在回圈中運行 scanf:
int rows, cols;
if(fscanf(file, "%d %d", &rows, &cols) != 2) {
// error
}
int num;
for(int i = 0; i<rows; i) {
for(int j = 0; j < (cols - 1); j) {
if(fscanf(file, "%d", &num) == 1) {
printf("%d ", num);
}
else { /* error */ }
}
if(fscanf(file, "%d", &num) == 1) {
printf("%d\n", num); // last col handled differently
}
else { /* error */ }
}
如果你想一次接收整行,你可以使用 int 陣列(不需要字串,就像你的例子一樣)
int* row = malloc(sizeof(int) * cols); // allocate memory for array
for(int i = 0; i<rows; i) {
for(int j = 0; j < cols; j) {
if(fscanf(file, "%d", &row[j]) != 1) { /* error */}
}
// do what you want with your row
}
free(row); // release array memory
uj5u.com熱心網友回復:
為了讀取具有不同行數和列數的檔案,我建議您在讀取包含行數和列數的第一行后動態分配記憶體。
例子:
#include <stdio.h>
#include <stdlib.h> // malloc/free
int main(int argc, char* argv[]) {
if(argc != 2) return 1;
FILE *file = fopen(argv[1], "r");
if (file == NULL) {
perror("fopen");
return 1;
}
int ROW, COL;
if(fscanf(file, "%d %d", &ROW, &COL) != 2 || ROW < 1 || COL < 1) {
fprintf(stderr, "invalid file format\n");
return 1;
}
// allocate the needed memory to store the data:
int (*arr)[COL] = malloc(ROW * sizeof *arr);
if(arr == NULL) {
perror("malloc");
return 1;
}
// read the data from file into your dynamically allocated array:
for(int row = 0; row < ROW; row) {
for(int col = 0; col < COL; col) {
if(fscanf(file, " %d", &arr[row][col]) != 1) {
fprintf(stderr, "invalid file format\n");
fclose(file);
free(arr);
return 1;
}
}
}
fclose(file);
// display the result:
printf("ROW: %d COL: %d\n", ROW, COL);
for(int row = 0; row < ROW; row) {
for(int col = 0; col < COL; col) {
printf("%d ", arr[row][col]);
}
putchar('\n');
}
free(arr); // release the memory allocated dynamically
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/488054.html
標籤:C
