我有一個 .txt 檔案,其中包含一些格式如下的值:
0,30,25,10
現在,我打開檔案并將其存盤到一個陣列中
char imposta_tratt[300];
FILE *fp;
fp = fopen("/home/pi/Documents/imposta_trattamento.txt", "r");
if (fp == 0) return;
fread(imposta_tratt, sizeof(imposta_tratt), 1, fp);
fclose(fp);
現在我希望陣列充滿我的資料。我有由 a 分隔的值,,所以我繼續決議它:
const char delim[2] = ",";
int t=0;
char *token = strtok(imposta_tratt, delim);
while (token!=NULL){
strcpy(tratt[t],token);
token = strtok(NULL, delim);
tratt[t]=token;
t ;
}
在這里,指的是檔案 .txt 中的內容,我希望擁有tratt[0]=0; tratt[1]=30; tratt[2]=25;等等,但似乎我錯過了一些東西,因為它不是這樣的。
我想要的只是將 txt 檔案的值存盤在單個變數中。有人可以幫忙嗎?
uj5u.com熱心網友回復:
fread您需要空終止讀取的字符陣列,以便您可以將其傳遞給決議器函式,您可以使用的回傳值來fread執行此操作。
的第二個引數fread是要讀取的每個元素的位元組大小,它是 1,因為它是字符的大小,而第三個引數是元素的數量,我們可以將其設定為目標緩沖區的大小以免超過它。
ssize_t size = fread(imposta_tratt, 1, sizeof(imposta_tratt) - 1, fp);
if(size > 0)
imposta_tratt[size] = 0;
對于決議:
char tratt[size][20]; // worst case scenario you'll need *size* lines
const char delim[] = ",";
int t = 0;
char *token = strtok(imposta_tratt, delim);
while (token != NULL) {
if(strlen(token) < 20){
strcpy(tratt[t], token);
t ;
}
token = strtok(NULL, delim);
}
確保不要丟失陣列t中已使用行的大小,這tratt將有助于了解決議了多少行并用作限制,從而避免越界訪問。
現場樣品
請注意,決議后的值仍然是字串,如果要將它們轉換為數字變數,可以使用strtol.
uj5u.com熱心網友回復:
假設"in.txt"有內容
0,30,25,10
下面的程式用于fscanf將整數一個接一個地讀入tratt陣列。當我們使用 讀取整數fscanf時,我們確保它的回傳值符合預期。如果沒有,我們關閉檔案并退出。如果 的回傳值fscanf與預期不符,程式還會列印發生了哪種型別的錯誤。目前,如果發生任何錯誤,程式將停止。但是,如果您愿意,可以根據發生的錯誤使程式的行為有所不同。
作為輸出,程式列印所有讀入tratt陣列的整數。輸出是
0
30
25
10
現在這個程式假設我們知道要讀入的元素數量tratt。如果不這樣做,我們可以允許在陣列需要更多元素時動態分配更多記憶體,或者"in.txt"可能包含一個資料結構,例如,在檔案的開頭/結尾處記錄有關檔案的資訊,例如數字的數量在檔案和資料型別中(二進制檔案最適合此)。這些只是其中的幾種可能性。
更好的方法可能是逐個讀取字符(例如,使用getc)并使用strtol將字符數字序列轉換為 a long int(我會采用與此類似的方法)。
然而,這種方法更簡潔,應該足夠了。
#include <stdio.h>
#include <stdlib.h>
#define FILE_NAME "in.txt"
#define MAX_LEN 4
int main(void) {
int i, tratt[MAX_LEN];
FILE *fp = fopen(FILE_NAME, "r"); /* open file for reading */
/* if cannot open file */
if (fp == NULL) {
printf("Cannot open %s\n", FILE_NAME);
exit(EXIT_FAILURE);
}
/* read integer, checking return value of scanf as expected */
if (fscanf(fp, "%d", &tratt[0]) != 1) {
if (ferror(fp))
printf("fscanf: read error\n");
else if (feof(fp))
printf("fscanf: end of file\n");
else
printf("fscanf: matching failure\n");
fclose(fp);
exit(EXIT_FAILURE);
}
for (i = 1; i < MAX_LEN; i )
/* read comma plus integer, checking return value of scanf */
if (fscanf(fp, ",%d", &tratt[i]) != 1) {
if (ferror(fp))
printf("fscanf: read error\n");
else if (feof(fp))
printf("fscanf: end of file\n");
else
printf("fscanf: matching failure\n");
fclose(fp);
exit(EXIT_FAILURE);
}
fclose(fp); /* close file */
/* print integers stored in tratt */
for (i = 0; i < MAX_LEN; i )
printf("%d\n", tratt[i]);
return 0;
}
uj5u.com熱心網友回復:
您想要實作的目標可以簡單地使用fgets():
bool read_file_content(const char *filename, const size_t tsizemax, int tratt[tsizemax], size_t *tsize, const char *delim)
{
// Attempt to open filename.
FILE *fp = fopen(filename, "r");
if (!fp) return false; // Return false upon failure.
// Try to read one line. If you have more, you need a while loop.
char imposta_tratt[300];
if (!fgets(imposta_tratt, sizeof imposta_tratt, fp)) {
fclose(fp);
return false;
}
*tsize = 0;
char tmp[300]; // Temporary buffer. Used for conversion into int.
char *token = strtok(imposta_tratt, delim);
while (token && *tsize < tsizemax) {
strncpy(tmp, token, sizeof tmp);
tratt[(*tsize) ] = atoi(tmp);
token = strtok(NULL, delim);
}
fclose(fp);
return true;
}
const char *filename:要決議的檔案。const size_t tsizemaxtratt:陣列的最大大小。控制大小很重要,否則您的代碼將出現緩沖區溢位(例如,當您的檔案有超過 100 個標記時)。int tratt[tsizemax]:將保存值的陣列。size_t *tsize: 讀取的令牌數(與 結合使用tsizemax)。const char *delim:分隔符,在您的情況下為 a,。
這是你的main():
int main(void)
{
int tratt[100];
size_t size = 0;
if (!read_file_content("in.txt", 100, tratt, &size, ",")) {
puts("Failed");
return 1;
}
for (size_t i = 0; i < size; i)
printf("%d\n", tratt[i]);
}
輸出:
0
30
25
10
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462106.html
下一篇:分配記憶體引導加載程式/程式集
