Чтение данных из файлов в C

Итак, у меня есть большой текстовый файл с данными в нем, и я хотел бы изменить его. Данные содержат комбинацию целых чисел и чисел с плавающей запятой в каждой строке, но меня интересует только получение первого целого числа, равного 1 или 0, и размещение его в конце строки.

Например, в моем файле данных у меня есть следующая строка
1 0.41 1 44
и я хотел бы быть
0.41 1 44 1

Это то, что я имею до сих пор и не могу заставить его работать правильно. Благодарю.

void main() {
FILE *fp;
FILE *out;

char str[15];
char temp;

fp = fopen("dust.txt", "r+");
out = fopen("dust.dat", "w");

while(fgets(str, sizeof(str), fp) != NULL) {
    temp = str[0];
    str[strlen(str)] = ' ';
    str[strlen(str)+1] = temp;
    str[strlen(str)+2] = '\r';
    str[strlen(str)+3] = '\n';

fwrite(str, 1, strlen(str), out);
}   

fclose(fp);
    fclose(out);
}

2 ответа

Решение

Это обрабатывает вывод как текстовый файл (такой же как ввод), а не как двоичный файл. Я положил комментарии кода, где это уместно. Ваша самая серьезная ошибка была в звонке strlen после перезаписи строкового терминатора. В любом случае нужно позвонить только один раз.

#include <stdio.h>
#include <string.h>

int main(void)  {                           // main must be type int
    FILE *fp;
    FILE *out;
    char str[100];                          // be generous
    size_t len;

    fp = fopen("dust.txt", "r");
    out = fopen("dust2.txt", "w");          // text file
    if(fp == NULL || out == NULL)
        return 1;

    while(fgets(str, sizeof(str)-3, fp) != NULL) {
        str [ strcspn(str, "\r\n") ] = 0;   // remove trailing newline etc
        len = strlen(str);
        str[len] = ' ';                     // overwrites terminator
        str[len+1] = str[0];                // move digit from front
        str[len+2] = 0;                     // terminate string
        fprintf(out, "%s\n", str + 2);      // write as text
    }   

    fclose(fp);
    fclose(out);
    return 0;
}

Входной файл:

1 0.41 1 44
0 1.23 2 555

Выходной файл:

0.41 1 44 1
1.23 2 555 0

Подумай об этих 2 строчках

str[strlen(str)] = ' ';
str[strlen(str)+1] = temp;

Первый устанавливает нулевой символ ' ', 2-е звонки strlen(str), еще str больше не имеет определенного нулевого символа, который ведет к неопределенному поведению (UB).


Предложить вместо

str[strcspn(str, "\r\n")] = '\0'; // lop off potential end-of-line characters.
int prefix;
int n;
if (sscanf(str, "%d %n", &prefix, &n) != 1) Handle_Missing_Lead_int();
fprintf(out, "%s %d\n", &str[n], prefix); 

Открытие файла в текстовом режиме, а затем запись "\r\n" также проблема, так как код может написать "\r" а затем взять "\n" и перевести, чем в "\r\n" в результате чего "\r\r\n", Предложите либо открыть файл в текстовом режиме, либо написать один "\n" (который будет переведен по мере необходимости) или открытие файла в двоичном режиме и запись в явном виде "\r\n",


Кстати: подумайте о том, чтобы быть более щедрым, чем 15 в char str[15];, Может быть 100?

Другие вопросы по тегам